home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume26 / veos-2.0 / part05 < prev    next >
Encoding:
Text File  |  1993-04-25  |  84.0 KB  |  3,259 lines

  1. Newsgroups: comp.sources.unix
  2. From: voodoo@hitl.washington.edu (Geoffery Coco)
  3. Subject: v26i188: veos-2.0 - The Virtual Environment Operating Shell, V2.0, Part05/16
  4. Sender: unix-sources-moderator@vix.com
  5. Approved: paul@vix.com
  6.  
  7. Submitted-By: voodoo@hitl.washington.edu (Geoffery Coco)
  8. Posting-Number: Volume 26, Issue 188
  9. Archive-Name: veos-2.0/part05
  10.  
  11. #! /bin/sh
  12. # This is a shell archive.  Remove anything before this line, then unpack
  13. # it by saving it into a file and typing "sh file".  To overwrite existing
  14. # files, type "sh file -c".  You can also feed this as standard input via
  15. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  16. # will see the following message at the end:
  17. #        "End of archive 5 (of 16)."
  18. # Contents:  kernel_private/src/fern/fe_bnd.lsp
  19. #   kernel_private/src/fern/fe_ext.lsp kernel_private/src/fern/fern.c
  20. #   src/kernel_current/fern/fe_bnd.lsp
  21. #   src/kernel_current/fern/fe_ext.lsp src/kernel_current/fern/fern.c
  22. #   src/xlisp/xcore/c/xlimage.c
  23. # Wrapped by vixie@efficacy.home.vix.com on Sun Apr 25 23:10:36 1993
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'kernel_private/src/fern/fe_bnd.lsp' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'kernel_private/src/fern/fe_bnd.lsp'\"
  27. else
  28. echo shar: Extracting \"'kernel_private/src/fern/fe_bnd.lsp'\" \(10935 characters\)
  29. sed "s/^X//" >'kernel_private/src/fern/fe_bnd.lsp' <<'END_OF_FILE'
  30. X;;-----------------------------------------------------------
  31. X;; file: fe_bnd.lsp
  32. X;;
  33. X;; FERN is the Fractal Entity Relativity Node.
  34. X;; Part of the FE component of the Fern System.
  35. X;;
  36. X;; creation: March 28, 1992
  37. X;;
  38. X;; by Geoffrey P. Coco at the HITLab, Seattle
  39. X;;-----------------------------------------------------------
  40. X
  41. X
  42. X;;-----------------------------------------------------------
  43. X;; Copyright (C) 1992  Geoffrey P. Coco,
  44. X;; Human Interface Technology Lab, Seattle
  45. X;;-----------------------------------------------------------
  46. X
  47. X
  48. X
  49. X;;===========================================================
  50. X;;              Boundary
  51. X;;===========================================================
  52. X
  53. X(defun fe-put.bndry (bndry)
  54. X  (vput bndry '((~ "perc"
  55. X           @
  56. X           > @
  57. X           @) **)))
  58. X
  59. X;;-----------------------------------------------------------
  60. X
  61. X(defun fe-copy.bndry (&key (test-time nil))
  62. X  (car (vcopy '(("perc"
  63. X         @
  64. X         > @
  65. X         @) **)
  66. X          :test-time test-time)))
  67. X
  68. X;;-----------------------------------------------------------
  69. X
  70. X(defun fe-xtrct.bndry ()
  71. X  (vget '(("perc"
  72. X       @
  73. X       (> @@)
  74. X       @) **)))
  75. X
  76. X;;-----------------------------------------------------------
  77. X
  78. X(defun fe-get.bndry ()
  79. X  (car (vput "%" '((~ "perc"
  80. X              @
  81. X              > @
  82. X              @) **))))
  83. X
  84. X;;-----------------------------------------------------------
  85. X
  86. X
  87. X
  88. X;;===========================================================
  89. X;;               Virtual
  90. X;;===========================================================
  91. X
  92. X;; returns old virtual bndry
  93. X(defun fe-put.bndry.vrt (vbndry)
  94. X  (car (vput vbndry '((~ "perc"
  95. X             @
  96. X             (@ > @ @)
  97. X             @) **))))
  98. X
  99. X;;-----------------------------------------------------------
  100. X
  101. X;; cache this frequently used pattern in C level fern.
  102. X;; later, calls to fe-copy.bndry.vrt use precomputed pattern.
  103. X
  104. X(fbase-init-copy.bndry.vrt '(("perc"
  105. X                  @
  106. X                  (@ > @ @)
  107. X                  @) **))
  108. X
  109. X#|
  110. X(defun fe-copy.bndry.vrt (&key (test-time nil))
  111. X  (car (vcopy '(("perc"
  112. X         @
  113. X         (@ > @ @)
  114. X         @) **)
  115. X          :test-time test-time)))
  116. X|#
  117. X;;-----------------------------------------------------------
  118. X
  119. X(defun fe-xtrct.bndry.vrt ()
  120. X  (vget '(("perc"
  121. X       @
  122. X       (@ (> @@) @)
  123. X       @) **)))
  124. X
  125. X;;-----------------------------------------------------------
  126. X
  127. X(defun fe-get.bndry.vrt ()
  128. X  (car (vput "%" '(("perc"
  129. X            @
  130. X            (@ > @ @)
  131. X            @) **))))
  132. X
  133. X;;-----------------------------------------------------------
  134. X
  135. X
  136. X
  137. X;;===========================================================
  138. X;;               Virtual Objects
  139. X;;===========================================================
  140. X
  141. X(defun fe-jam.bndry.vrt.ob (ob)
  142. X  (vput ob '((~ "perc"
  143. X        @
  144. X        (@ (^ @@) @)
  145. X        @) **)))
  146. X
  147. X;;-----------------------------------------------------------
  148. X
  149. X;; objects are (ob-name (attr-list))
  150. X(defun fe-put.bndry.vrt.ob (ob)
  151. X  (cond
  152. X
  153. X   ;; assume object is already there
  154. X   ((car (vput ob `((~ "perc"
  155. X               @
  156. X               (@ (> (,(car ob) @) **) @)
  157. X               @) **))))
  158. X
  159. X   ;; object wasn't there, insert new one
  160. X   ((fe-jam.bndry.vrt.ob ob))
  161. X   ))
  162. X
  163. X;;-----------------------------------------------------------
  164. X
  165. X;; pass object name
  166. X(defun fe-copy.bndry.vrt.ob (ob-name &key (test-time nil))
  167. X  (car (vcopy `(("perc"
  168. X         @
  169. X         (@ (> (,ob-name @) **) @)
  170. X         @) **)
  171. X          :test-time test-time)))
  172. X
  173. X;;-----------------------------------------------------------
  174. X
  175. X(defun fe-xtrct.bndry.vrt.ob (ob-name)
  176. X  (car (vget `(("perc"
  177. X        @
  178. X        (@ (> (,ob-name @) **) @)
  179. X        @) **))))
  180. X
  181. X;;-----------------------------------------------------------
  182. X
  183. X(defun fe-get.bndry.vrt.ob (ob-name)
  184. X  (car (vput "%" `((~ "perc"
  185. X              @
  186. X              (@ ((~ ,ob-name > @) **) @)
  187. X              @) **))))
  188. X
  189. X;;-----------------------------------------------------------
  190. X
  191. X
  192. X
  193. X;;===========================================================
  194. X;;          Virtual Object - Complex
  195. X;;===========================================================
  196. X
  197. X(defun fe-copy.bndry.vrt.ob.names ()
  198. X  (vcopy `(("perc"
  199. X        @
  200. X        (@ ((> @ @) **) @)
  201. X        @) **)
  202. X     :freq "all"))
  203. X
  204. X;;-----------------------------------------------------------
  205. X
  206. X
  207. X
  208. X
  209. X;;===========================================================
  210. X;;          Virtual Object Attributes
  211. X;;===========================================================
  212. X
  213. X(defun fe-jam.bndry.vrt.ob.attr (ob-name attr)
  214. X  (cond
  215. X   ;; assume object exists, add new attr
  216. X   ((vput attr `((~ "perc"
  217. X            @
  218. X            (@ ((~ ,ob-name (^ @@)) **) @)
  219. X            @) **)))
  220. X   
  221. X   ;; object didn't exist, add new object with new attr.
  222. X   ((fe-jam.bndry.vrt.ob `(,ob-name (,attr))))
  223. X   ))
  224. X
  225. X;;-----------------------------------------------------------
  226. X
  227. X(defun fe-put.bndry.vrt.ob.attr (ob-name attr)
  228. X  (cond
  229. X
  230. X   ;; assume the object and attr exist, swap in new attr
  231. X   ((car (vput attr `((~ "perc"
  232. X             @
  233. X             (@ ((~ ,ob-name (> (,(car attr) @) **)) **) @)
  234. X             @) **))))
  235. X   
  236. X   ;; attr didn't exist, add new attr
  237. X   ((fe-jam.bndry.vrt.ob.attr ob-name attr))
  238. X   ))
  239. X
  240. X;;-----------------------------------------------------------
  241. X
  242. X(defun fe-xtrct.bndry.vrt.ob.attr (ob-name attr-name)
  243. X  (car (vget `(("perc"
  244. X        @
  245. X        (@ ((,ob-name (> (,attr-name @) **)) **) @)
  246. X        @) **))))
  247. X
  248. X;;-----------------------------------------------------------
  249. X
  250. X(defun fe-get.bndry.vrt.ob.attr (ob-name attr-name)
  251. X  (car (vput "%" `((~ "perc"
  252. X              @
  253. X              (@ ((~ ,ob-name ((~ ,attr-name > @) **)) **) @)
  254. X              @) **))))
  255. X
  256. X;;-----------------------------------------------------------
  257. X
  258. X;; returns attr struct
  259. X(defun fe-copy.bndry.vrt.ob.attr (ob-name attr-name &key (test-time nil))
  260. X  (car (vcopy `(("perc"
  261. X         @
  262. X         (@ ((,ob-name (> (,attr-name @) **)) **) @)
  263. X         @) **)
  264. X          :test-time test-time)))
  265. X  
  266. X;;-----------------------------------------------------------
  267. X
  268. X
  269. X
  270. X;;===========================================================
  271. X;;         Virtual Object Attributes - Complex
  272. X;;===========================================================
  273. X
  274. X;; returns list of boundary attribute names
  275. X(defun fe-copy.bndry.vrt.ob.attr.names (ob-name)
  276. X  (vcopy `(("perc"
  277. X        @
  278. X        (@ ((,ob-name ((> @ @) **)) **) @)
  279. X        @) **)
  280. X     :freq "all"))
  281. X
  282. X;;-----------------------------------------------------------
  283. X
  284. X;; returns attr val
  285. X(defun fe-copy.bndry.vrt.ob.attr.val (ob-name attr-name)
  286. X  (car (vcopy `(("perc"
  287. X         @
  288. X         (@ ((,ob-name ((,attr-name > @) **)) **) @)
  289. X         @) **))))
  290. X  
  291. X;;-----------------------------------------------------------
  292. X
  293. X
  294. X
  295. X
  296. X;;===========================================================
  297. X;;            Physical Sub-Partition
  298. X;;===========================================================
  299. X
  300. X;; returns old physical bndry
  301. X(defun fe-put.bndry.phys (vbndry)
  302. X  (car (vput vbndry '((~ "perc"
  303. X             @
  304. X             (@2 > @)
  305. X             @) **))))
  306. X
  307. X;;-----------------------------------------------------------
  308. X
  309. X(defun fe-copy.bndry.phys (&key (test-time nil))
  310. X  (car (vcopy '(("perc"
  311. X         @
  312. X         (@2 > @)
  313. X         @) **)
  314. X          :test-time test-time)))
  315. X
  316. X;;-----------------------------------------------------------
  317. X
  318. X(defun fe-xtrct.bndry.phys ()
  319. X  (vget '(("perc"
  320. X       @
  321. X       (@2 (> @@))
  322. X       @) **)))
  323. X
  324. X;;-----------------------------------------------------------
  325. X
  326. X(defun fe-get.bndry.phys ()
  327. X  (car (vput "%" '((~ "perc"
  328. X              @
  329. X              (@2 > @)
  330. X              @) **))))
  331. X
  332. X;;-----------------------------------------------------------
  333. X
  334. X
  335. X
  336. X;;===========================================================
  337. X;;               Physical Objects
  338. X;;===========================================================
  339. X
  340. X(defun fe-jam.bndry.phys.ob (ob)
  341. X  (vput ob '((~ "perc"
  342. X        @
  343. X        (@2 (^ @@))
  344. X        @) **)))
  345. X  
  346. X;;-----------------------------------------------------------
  347. X
  348. X;; objects are (ob-name (attr-list))
  349. X(defun fe-put.bndry.phys.ob (ob)
  350. X  (cond
  351. X
  352. X   ;; assume object is already there
  353. X   ((car (vput ob `((~ "perc"
  354. X               @
  355. X               (@2 (> (,(car ob) @) **))
  356. X               @) **))))
  357. X
  358. X   ;; object wasn't there, insert new one
  359. X   ((fe-jam.bndry.phys.ob ob))
  360. X   ))
  361. X
  362. X;;-----------------------------------------------------------
  363. X
  364. X;; pass object name
  365. X(defun fe-copy.bndry.phys.ob (ob-name &key (test-time nil))
  366. X  (car (vcopy `(("perc"
  367. X         @
  368. X         (@2 (> (,ob-name @) **))
  369. X         @) **)
  370. X          :test-time test-time)))
  371. X
  372. X;;-----------------------------------------------------------
  373. X
  374. X(defun fe-xtrct.bndry.phys.ob (ob-name)
  375. X  (car (vget `(("perc"
  376. X        @
  377. X        (@2 (> (,ob-name @) **))
  378. X        @) **))))
  379. X
  380. X;;-----------------------------------------------------------
  381. X
  382. X(defun fe-get.bndry.phys.ob (ob-name)
  383. X  (car (vput "%" `((~ "perc"
  384. X              @
  385. X              (@2 ((~ ,ob-name > @) **))
  386. X              @) **))))
  387. X
  388. X;;-----------------------------------------------------------
  389. X
  390. X
  391. X
  392. X
  393. X;;===========================================================
  394. X;;          Physical Object - Complex
  395. X;;===========================================================
  396. X
  397. X(defun fe-copy.bndry.phys.ob.names ()
  398. X  (vcopy `(("perc"
  399. X        @
  400. X        (@2 ((> @ @) **))
  401. X        @) **)
  402. X     :freq "all"))
  403. X
  404. X;;-----------------------------------------------------------
  405. X
  406. X
  407. X
  408. X
  409. X;;===========================================================
  410. X;;          Physical Object Attributes
  411. X;;===========================================================
  412. X
  413. X(defun fe-jam.bndry.phys.ob.attr (ob-name attr)
  414. X  (cond
  415. X   ;; assume object exists, add new attr
  416. X   ((vput attr `((~ "perc"
  417. X            @
  418. X            (@2 ((~ ,ob-name (^ @@)) **))
  419. X            @) **)))
  420. X
  421. X   ;; object didn't exist, add new object with new attr.
  422. X   ((fe-jam.bndry.phys.ob `(,ob-name (,attr))))
  423. X   ))
  424. X
  425. X;;-----------------------------------------------------------
  426. X
  427. X(defun fe-put.bndry.phys.ob.attr (ob-name attr)
  428. X  (cond
  429. X
  430. X   ;; assume the object and attr exist, swap in new attr
  431. X   ((car (vput attr `((~ "perc"
  432. X             @
  433. X             (@2 ((~ ,ob-name (> (,(car attr) @) **)) **))
  434. X             @) **))))
  435. X   
  436. X   ;; attr didn't exist, add new attr
  437. X   ((fe-jam.bndry.phys.ob.attr ob-name attr))
  438. X   ))
  439. X
  440. X;;-----------------------------------------------------------
  441. X
  442. X(defun fe-xtrct.bndry.phys.ob.attr (ob-name attr-name)
  443. X  (car (vget `(("perc"
  444. X        @
  445. X        (@2 ((,ob-name (> (,attr-name @) **)) **))
  446. X        @) **))))
  447. X
  448. X;;-----------------------------------------------------------
  449. X
  450. X(defun fe-get.bndry.phys.ob.attr (ob-name attr-name)
  451. X  (car (vput "%" `((~ "perc"
  452. X              @
  453. X              (@2 ((~ ,ob-name ((~ ,attr-name > @) **)) **))
  454. X              @) **))))
  455. X
  456. X;;-----------------------------------------------------------
  457. X
  458. X;; returns attr struct
  459. X(defun fe-copy.bndry.phys.ob.attr (ob-name attr-name &key (test-time nil))
  460. X  (car (vcopy `(("perc"
  461. X         @
  462. X         (@2 ((,ob-name (> (,attr-name @) **)) **))
  463. X         @) **)
  464. X          :test-time test-time)))
  465. X  
  466. X;;-----------------------------------------------------------
  467. X
  468. X
  469. X
  470. X;;===========================================================
  471. X;;         Physical Object Attributes - Complex
  472. X;;===========================================================
  473. X
  474. X;; returns list of boundary attribute names
  475. X(defun fe-copy.bndry.phys.ob.attr.names (ob-name)
  476. X  (vcopy `(("perc"
  477. X        @
  478. X        (@2 ((,ob-name ((> @ @) **)) **))
  479. X        @) **)
  480. X     :freq "all"))
  481. X
  482. X;;-----------------------------------------------------------
  483. X
  484. X;; returns attr val
  485. X(defun fe-copy.bndry.phys.ob.attr.val (ob-name attr-name)
  486. X  (car (vcopy `(("perc"
  487. X         @
  488. X         (@2 ((,ob-name ((,attr-name > @) **)) **))
  489. X         @) **))))
  490. X  
  491. X;;-----------------------------------------------------------
  492. X
  493. X
  494. X
  495. X
  496. END_OF_FILE
  497. if test 10935 -ne `wc -c <'kernel_private/src/fern/fe_bnd.lsp'`; then
  498.     echo shar: \"'kernel_private/src/fern/fe_bnd.lsp'\" unpacked with wrong size!
  499. fi
  500. # end of 'kernel_private/src/fern/fe_bnd.lsp'
  501. fi
  502. if test -f 'kernel_private/src/fern/fe_ext.lsp' -a "${1}" != "-c" ; then 
  503.   echo shar: Will not clobber existing file \"'kernel_private/src/fern/fe_ext.lsp'\"
  504. else
  505. echo shar: Extracting \"'kernel_private/src/fern/fe_ext.lsp'\" \(11360 characters\)
  506. sed "s/^X//" >'kernel_private/src/fern/fe_ext.lsp' <<'END_OF_FILE'
  507. X;;-----------------------------------------------------------
  508. X;; file: fe_ext.lsp
  509. X;;
  510. X;; FERN is the Fractal Entity Relativity Node.
  511. X;; Part of the FE component of the Fern System.
  512. X;;
  513. X;; creation: March 28, 1992
  514. X;;
  515. X;; by Geoffrey P. Coco at the HITLab, Seattle
  516. X;;-----------------------------------------------------------
  517. X
  518. X
  519. X;;-----------------------------------------------------------
  520. X;; Copyright (C) 1992  Geoffrey P. Coco,
  521. X;; Human Interface Technology Lab, Seattle
  522. X;;-----------------------------------------------------------
  523. X
  524. X
  525. X;;===========================================================
  526. X;;              External
  527. X;;===========================================================
  528. X
  529. X(defun fe-put.ext (ext)
  530. X  (vput ext '((~ "perc"
  531. X         > @
  532. X         @
  533. X         @) **)))
  534. X
  535. X;;-----------------------------------------------------------
  536. X
  537. X(defun fe-copy.ext (&key (test-time nil))
  538. X  (car (vcopy '(("perc"
  539. X         > @
  540. X         @
  541. X         @) **)
  542. X          :test-time test-time)))
  543. X
  544. X;;-----------------------------------------------------------
  545. X
  546. X(defun fe-xtrct.ext ()
  547. X  (vget '(("perc"
  548. X       (> @@)
  549. X       @
  550. X       @) **)))
  551. X
  552. X;;-----------------------------------------------------------
  553. X
  554. X(defun fe-get.ext ()
  555. X  (car (vput "%" '((~ "perc"
  556. X              > @
  557. X              @
  558. X              @) **))))
  559. X
  560. X;;-----------------------------------------------------------
  561. X
  562. X
  563. X
  564. X;;===========================================================
  565. X;;            Spaces Sub-Partition
  566. X;;===========================================================
  567. X
  568. X;; returns old space-list
  569. X(defun fe-put.ext.sps (sps)
  570. X  (car (vput sps '((~ "perc"
  571. X              (> @ @2)
  572. X              @2) **))))
  573. X
  574. X;;-----------------------------------------------------------
  575. X
  576. X(defun fe-copy.ext.sps (&key (test-time nil))
  577. X  (car (vcopy '(("perc"
  578. X         (> @ @2)
  579. X         @2) **)
  580. X          :test-time test-time)))
  581. X
  582. X;;-----------------------------------------------------------
  583. X
  584. X(defun fe-xtrct.ext.sps ()
  585. X  (vget '(("perc"
  586. X       ((> @@) @2)
  587. X       @2) **)))
  588. X
  589. X;;-----------------------------------------------------------
  590. X
  591. X(defun fe-get.ext.sps ()
  592. X  (car (vput "%" '((~ "perc"
  593. X              (> @ @2)
  594. X              @2) **))))
  595. X
  596. X;;-----------------------------------------------------------
  597. X
  598. X
  599. X;;===========================================================
  600. X;;               Spaces Entities
  601. X;;===========================================================
  602. X
  603. X;; an ent is (uid data)
  604. X(defun fe-jam.ext.sps.ent (ent)
  605. X  (vput ent '((~ "perc"
  606. X         ((^ @@) @2)
  607. X         @2) **)))
  608. X
  609. X;;-----------------------------------------------------------
  610. X
  611. X;; an ent is (uid data)
  612. X(defun fe-put.ext.sps.ent (ent)
  613. X  (cond
  614. X   ;; assume the entity already exists, swap in new one
  615. X   ((car (vput ent `((~ "perc"
  616. X            ((> (,(car ent) @) **) @2)
  617. X            @2) **))))
  618. X
  619. X   ;; entity didn' exist, insert new ent
  620. X   ((fe-jam.ext.sps.ent ent))))
  621. X
  622. X;;-----------------------------------------------------------
  623. X
  624. X(defun fe-copy.ext.sps.ent (uid &key (test-time nil))
  625. X  (car (vcopy `(("perc"
  626. X         ((> (,uid @) **) @2)
  627. X         @2) **)
  628. X          :test-time test-time)))
  629. X
  630. X;;-----------------------------------------------------------
  631. X
  632. X(defun fe-xtrct.ext.sps.ent (uid)
  633. X  (car (vget `(("perc"
  634. X        ((> (,uid @) **) @2)
  635. X        @2) **))))
  636. X
  637. X;;-----------------------------------------------------------
  638. X
  639. X(defun fe-get.ext.sps.ent (uid)
  640. X  (car (vput "%" `((~ "perc"
  641. X              (((~ ,uid > @) **) @2)
  642. X              @2) **))))
  643. X
  644. X;;-----------------------------------------------------------
  645. X
  646. X
  647. X
  648. X;;===========================================================
  649. X;;           Siblings Sub-Partition
  650. X;;===========================================================
  651. X
  652. X;; returns old sib-list
  653. X(defun fe-put.ext.sibs (sibs)
  654. X  (car (vput sibs '((~ "perc"
  655. X               (@ > @ @)
  656. X               @2) **))))
  657. X
  658. X;;-----------------------------------------------------------
  659. X
  660. X(defun fe-copy.ext.sibs (&key (test-time nil))
  661. X  (car (vcopy '(("perc"
  662. X         (@ > @ @)
  663. X         @2) **)
  664. X          :test-time test-time)))
  665. X
  666. X;;-----------------------------------------------------------
  667. X
  668. X(defun fe-xtrct.ext.sibs ()
  669. X  (vget '(("perc"
  670. X       (@ (> @@) @)
  671. X       @2) **)))
  672. X
  673. X;;-----------------------------------------------------------
  674. X
  675. X(defun fe-get.ext.sibs ()
  676. X  (car (vput "%" '((~ "perc"
  677. X              (@ > @ @)
  678. X              @2) **))))
  679. X
  680. X;;-----------------------------------------------------------
  681. X
  682. X
  683. X
  684. X;;===========================================================
  685. X;;              Siblings Entities
  686. X;;===========================================================
  687. X
  688. X(defun fe-jam.ext.sibs.ent (ent)
  689. X  (vput ent '((~ "perc"
  690. X         (@ (^ @@) @)
  691. X         @2) **)))
  692. X   
  693. X;;-----------------------------------------------------------
  694. X
  695. X;; sibling entities are in the form: (uid (virtual object list))
  696. X(defun fe-put.ext.sibs.ent (ent)
  697. X  (cond
  698. X   ;; assume the ent exists, swap in new ent
  699. X   ((car (vput ent `((~ "perc"
  700. X            (@ (> (,(car ent) @) **) @)
  701. X            @2) **))))
  702. X   ;; the ent didn't exist, add new ent
  703. X   ((fe-jam.ext.sibs.ent ent))
  704. X   ))
  705. X
  706. X;;-----------------------------------------------------------
  707. X
  708. X(defun fe-copy.ext.sibs.ent (uid &key (test-time nil))
  709. X  (car (vcopy `(("perc"
  710. X         (@ (> (,uid @) **) @)
  711. X         @2) **)
  712. X          :test-time test-time)))
  713. X
  714. X;;-----------------------------------------------------------
  715. X
  716. X(defun fe-xtrct.ext.ents.ent (uid)
  717. X  (car (vget `(("perc"
  718. X        (@ (> (,uid @) **) @)
  719. X        @2) **))))
  720. X
  721. X;;-----------------------------------------------------------
  722. X
  723. X(defun fe-get.ext.ents.ent (uid)
  724. X  (car (vput "%" `((~ "perc"
  725. X              (@ ((~ ,uid > @) **) @)
  726. X              @2) **))))
  727. X
  728. X;;-----------------------------------------------------------
  729. X
  730. X
  731. X
  732. X;;===========================================================
  733. X;;         Siblings Entities - Complex
  734. X;;===========================================================
  735. X
  736. X;; returns list of all external sibs' uids
  737. X(defun fe-copy.ext.sibs.uids ()
  738. X  (vcopy '(("perc"
  739. X        (@ ((> @ @) **) @)
  740. X        @2) **)
  741. X     :freq "all"))
  742. X
  743. X;;-----------------------------------------------------------
  744. X
  745. X
  746. X
  747. X
  748. X;;===========================================================
  749. X;;          Sibling Entities Objects
  750. X;;===========================================================
  751. X
  752. X(defun fe-jam.ext.sibs.ent.ob (uid ob)
  753. X  (cond
  754. X
  755. X   ;; assume entity exists, insert new object
  756. X   ((vput ob `((~ "perc"
  757. X          (@ ((~ ,uid (^ @@)) **) @)
  758. X          @2) **)))
  759. X
  760. X   ;; entity wasn't there, insert new entity with new object
  761. X   ((fe-jam.ext.sibs.ent `(,uid (,ob))))
  762. X   ))
  763. X   
  764. X;;-----------------------------------------------------------
  765. X
  766. X;; ob is a normal object structure: (name (attr-list))
  767. X(defun fe-put.ext.sibs.ent.ob (uid ob)
  768. X  (cond
  769. X
  770. X   ;; assume entity and object exist, swap in new object
  771. X   ((car (vput ob `((~ "perc"
  772. X               (@ ((~ ,uid (> (,(car ob) @) **)) **) @)
  773. X               @2) **))))
  774. X   
  775. X   ;; object wasn't there, assume entity exists, insert new object
  776. X   ((fe-jam.ext.sibs.ent.ob uid ob))
  777. X   ))
  778. X   
  779. X;;-----------------------------------------------------------
  780. X
  781. X(defun fe-copy.ext.sibs.ent.ob (uid ob-name &key (test-time nil))
  782. X  (car (vcopy `(("perc"
  783. X         (@ ((,uid (> (,ob-name @) **)) **) @)
  784. X         @2) **)
  785. X          :test-time test-time)))
  786. X
  787. X;;-----------------------------------------------------------
  788. X
  789. X(defun fe-xtrct.ext.sibs.ent.ob (uid ob-name)
  790. X  (car (vget `(("perc"
  791. X        (@ ((,uid (> (,ob-name @) **)) **) @)
  792. X        @2) **))))
  793. X
  794. X;;-----------------------------------------------------------
  795. X
  796. X(defun fe-get.ext.sibs.ent.ob (uid ob-name)
  797. X  (car (vput "%" `((~ "perc"
  798. X              (@ ((~ ,uid ((~ ,ob-name > @) **)) **) @)
  799. X              @2) **))))
  800. X
  801. X;;-----------------------------------------------------------
  802. X
  803. X
  804. X
  805. X;;===========================================================
  806. X;;         Sibling Entities Objects - Complex
  807. X;;===========================================================
  808. X
  809. X;; pass uid, get list of it's ob names
  810. X(defun fe-copy.ext.sibs.ent.ob.names (uid)
  811. X  (vcopy `(("perc"
  812. X        (@ ((,uid ((> @ @) **)) **) @)
  813. X        @2) **)
  814. X     :freq "all"))
  815. X
  816. X;;-----------------------------------------------------------
  817. X
  818. X
  819. X
  820. X;;===========================================================
  821. X;;         Sibling Entities Objects Attributes
  822. X;;===========================================================
  823. X
  824. X
  825. X(defun fe-jam.ext.sibs.ent.ob.attr (uid ob-name attr)
  826. X  (cond
  827. X   ;; assume entity and ob exists, insert new attr
  828. X   ((vput attr `((~ "perc"
  829. X          (@
  830. X           ((~ ,uid ((~ ,ob-name (^ @@)) **)) **)
  831. X           @)
  832. X          @2) **)))
  833. X  
  834. X   ;; ob wasn't there, insert new ob with new attr
  835. X   ((fe-jam.ext.sibs.ent.ob uid `(,ob-name (,attr))))
  836. X   ))
  837. X
  838. X;;-----------------------------------------------------------
  839. X
  840. X;; attr is ("attr-name" attr-val)
  841. X(defun fe-put.ext.sibs.ent.ob.attr (uid ob-name attr)
  842. X  (cond
  843. X   ;; assume the ent, ob and attr exist, swap in new attr
  844. X   ((car (vput attr `((~ "perc"
  845. X             (@ 
  846. X              ((~ ,uid ((~ ,ob-name (> (,(car attr) @) **)) **)) **)
  847. X              @)
  848. X             @2) **))))
  849. X
  850. X   ;; attr wasn't there, insert new attr
  851. X   ((fe-jam.ext.sibs.ent.ob.attr uid ob-name attr))
  852. X   ))
  853. X   
  854. X;;-----------------------------------------------------------
  855. X
  856. X;; pass uid, ob-num, attr-name
  857. X(defun fe-copy.ext.sibs.ent.ob.attr (uid ob-num attr-name &key (test-time nil))
  858. X  (car (vcopy `(("perc"
  859. X         (@
  860. X          ((,uid ((,ob-num (> (,attr-name @) **)) **)) **)
  861. X          @)
  862. X         @2) **)
  863. X          :test-time test-time)))
  864. X
  865. X;;-----------------------------------------------------------
  866. X
  867. X;; pass uid, ob-num, attr-name
  868. X(defun fe-xtrct.ext.sibs.ent.ob.attr (uid ob-num attr-name)
  869. X  (car (vget `(("perc"
  870. X        (@
  871. X         ((,uid ((,ob-num (> (,attr-name @) **)) **)) **)
  872. X         @)
  873. X        @2) **))))
  874. X
  875. X;;-----------------------------------------------------------
  876. X
  877. X;; pass uid, ob-num, attr-name
  878. X(defun fe-get.ext.sibs.ent.ob.attr (uid ob-num attr-name)
  879. X  (car (vput "%" `((~ "perc"
  880. X            (@
  881. X             ((~ ,uid ((~ ,ob-num ((~ ,attr-name > @) **)) **)) **)
  882. X             @)
  883. X            @2) **))))
  884. X
  885. X;;-----------------------------------------------------------
  886. X
  887. X
  888. X;;===========================================================
  889. X;;    Sibling Entities Objects Attributes - Complex
  890. X;;===========================================================
  891. X
  892. X;; pass uid and ob, return attr-list
  893. X(defun fe-copy.ext.sibs.ent.ob.attr.names (uid ob-name)
  894. X  (vcopy `(("perc"
  895. X        (@
  896. X         ((,uid ((,ob-name ((> @ @) **)) **)) **)
  897. X         @)
  898. X        @2) **)
  899. X     :freq "all"))
  900. X
  901. X;;-----------------------------------------------------------
  902. X
  903. X;; pass attr, return values of all objects of all sibs
  904. X(defun fe-copy.ext.sibs.attr.vals (attr-name)
  905. X  (vcopy `(("perc"
  906. X        (@
  907. X         ((@ ((@ ((,attr-name > @) **)) **)) **)
  908. X         @)
  909. X        @2) **)
  910. X     :freq "all"))
  911. X
  912. X;;-----------------------------------------------------------
  913. X
  914. X;; pass uid, ob-num, attr-name
  915. X(defun fe-copy.ext.sibs.ent.ob.attr.val (uid ob-num attr-name)
  916. X  (car (vcopy `(("perc"
  917. X         (@
  918. X          ((,uid ((,ob-num ((,attr-name > @) **)) **)) **)
  919. X          @)
  920. X         @2) **))))
  921. X
  922. X;;-----------------------------------------------------------
  923. X
  924. X
  925. X
  926. X
  927. X;;===========================================================
  928. X;;            Filters Sub-Partition
  929. X;;===========================================================
  930. X
  931. X;; filters are ("attr" (inclusion-list))
  932. X(defun fe-put.ext.fltrs (fltrs)
  933. X  (vput fltrs '((~ "perc"
  934. X           (@2 > @)
  935. X           @2) **)))
  936. X
  937. X;;-----------------------------------------------------------
  938. X
  939. X(defun fe-copy.ext.fltrs (&key (test-time nil))
  940. X  (car (vcopy '(("perc"
  941. X         (@2 > @)
  942. X         @2) **)
  943. X          :test-time test-time)))
  944. X
  945. X;;-----------------------------------------------------------
  946. X
  947. X(defun fe-xtrct.ext.fltrs ()
  948. X  (vget '(("perc"
  949. X       (@2 (> @@))
  950. X       @2) **)))
  951. X
  952. X;;-----------------------------------------------------------
  953. X
  954. X(defun fe-get.ext.fltrs ()
  955. X  (car (vput "%" '((~ "perc"
  956. X              (@2 > @)
  957. X              @2) **))))
  958. X
  959. X;;-----------------------------------------------------------
  960. END_OF_FILE
  961. if test 11360 -ne `wc -c <'kernel_private/src/fern/fe_ext.lsp'`; then
  962.     echo shar: \"'kernel_private/src/fern/fe_ext.lsp'\" unpacked with wrong size!
  963. fi
  964. # end of 'kernel_private/src/fern/fe_ext.lsp'
  965. fi
  966. if test -f 'kernel_private/src/fern/fern.c' -a "${1}" != "-c" ; then 
  967.   echo shar: Will not clobber existing file \"'kernel_private/src/fern/fern.c'\"
  968. else
  969. echo shar: Extracting \"'kernel_private/src/fern/fern.c'\" \(11012 characters\)
  970. sed "s/^X//" >'kernel_private/src/fern/fern.c' <<'END_OF_FILE'
  971. X/****************************************************************************************
  972. X * file: fern.c                                        *
  973. X *                                            *
  974. X * February 25, 1992: implementation of the Fractal Entity Relativity Node for veos.    *
  975. X *                                                    *
  976. X * by Geoffrey P. Coco at the HITLab, Seattle.                          *
  977. X *                                            *
  978. X ****************************************************************************************/
  979. X
  980. X/****************************************************************************************
  981. X * Copyright (C) 1992  Human Interface Technology Lab, Seattle                *
  982. X ****************************************************************************************/
  983. X
  984. X
  985. X/*--------------------------------------------------------------------------------*
  986. X                 Preliminaries
  987. X *--------------------------------------------------------------------------------*/
  988. X
  989. X
  990. X#include "xlisp.h"
  991. X#include "kernel.h"
  992. X#include "xv_native.h"
  993. X#include "fern.h"
  994. X
  995. X#include <math.h>
  996. X
  997. X/*--------------------------------------------------------------------------------*/
  998. X
  999. Xboolean        fbase_bInit = FALSE;
  1000. Xboolean        fbase_bGoing = FALSE;
  1001. XLVAL        s_pPersistFunc, s_pPersistProcs;
  1002. XTStampEntHash    fbase_pHashes[5];
  1003. Xint        fbase_iHashFree;
  1004. XTXMandRRec    fbase_pbCopyIntSubs;
  1005. XTXMandRRec    fbase_pbCopyBndryVrt;
  1006. X
  1007. X/*--------------------------------------------------------------------------------*/
  1008. X
  1009. Xvoid Fbase_Frame();
  1010. XTVeosErr Fbase_InitMatcherPBs();
  1011. X
  1012. X/*--------------------------------------------------------------------------------*/
  1013. X
  1014. X
  1015. X/*--------------------------------------------------------------------------------*
  1016. X                 Lisp Interface To Fern
  1017. X *--------------------------------------------------------------------------------*/
  1018. X
  1019. X
  1020. X/*--------------------------------------------------------------------------------*/
  1021. XLVAL Fbase_Init()
  1022. X{
  1023. X    if (!fbase_bInit) {
  1024. X
  1025. X    /** make permanent xlisp symbol to contain persist function call **/
  1026. X    
  1027. X    s_pPersistFunc = xlenter("FC-PRS-NTRY");
  1028. X    setvalue(s_pPersistFunc, cons(xlenter("FCON-PERSIST"), NIL));
  1029. X
  1030. X    s_pPersistProcs = xlenter("PERSIST-PROCS");
  1031. X
  1032. X    fbase_iHashFree = 0;
  1033. X
  1034. X    Fbase_InitMatcherPBs();
  1035. X    }
  1036. X
  1037. X    return(true);
  1038. X    }
  1039. X/*--------------------------------------------------------------------------------*/
  1040. X
  1041. X
  1042. X
  1043. X/*--------------------------------------------------------------------------------*/
  1044. XLVAL Fbase_fcon_time()
  1045. X{
  1046. X    xllastarg();
  1047. X
  1048. X    Fbase_Frame();
  1049. X
  1050. X    return(true);
  1051. X    } 
  1052. X/*--------------------------------------------------------------------------------*/
  1053. X
  1054. X
  1055. X/*--------------------------------------------------------------------------------*/
  1056. XLVAL Fbase_fcon_go()
  1057. X{
  1058. X    xllastarg();
  1059. X
  1060. X    fbase_bGoing = TRUE;
  1061. X    while (fbase_bGoing)
  1062. X    Fbase_Frame();
  1063. X
  1064. X    return(true);
  1065. X    }
  1066. X/*--------------------------------------------------------------------------------*/
  1067. X
  1068. X
  1069. X/*--------------------------------------------------------------------------------*/
  1070. XLVAL Fbase_fcon_local_ungo()
  1071. X{
  1072. X    xllastarg();
  1073. X
  1074. X    fbase_bGoing = FALSE;
  1075. X
  1076. X    return(true);
  1077. X    }
  1078. X/*--------------------------------------------------------------------------------*/
  1079. X
  1080. X
  1081. X/*--------------------------------------------------------------------------------*/
  1082. X/* returns: hash-table-index of new fern maintained hash table
  1083. X */
  1084. XLVAL Fbase_Hash_NewTab()
  1085. X{
  1086. X    int        i, iHashTab;
  1087. X    
  1088. X    iHashTab = fbase_iHashFree++;
  1089. X    for (i=0; i<12; i++)
  1090. X    fbase_pHashes[iHashTab][i] = nil;
  1091. X
  1092. X    return(cvfixnum(iHashTab));
  1093. X    }
  1094. X/*--------------------------------------------------------------------------------*/
  1095. X
  1096. X
  1097. X/*--------------------------------------------------------------------------------*/
  1098. X/* args: hash-table-refnum, new-uid, initial-float-data 
  1099. X */
  1100. XLVAL Fbase_Hash_AddUid()
  1101. X{
  1102. X    LVAL        pReturn = NIL, pUid;
  1103. X    int            i, iHashTab, iHashIndex;
  1104. X    float            fData;
  1105. X    TPStampEntRec    pNode, pFinger;
  1106. X
  1107. X    iHashTab = getfixnum(xlgafixnum());
  1108. X
  1109. X    pUid = xlgavector();
  1110. X#ifndef OPTIMAL
  1111. X    if (!IsUidElt(pUid))
  1112. X    xlbadtype(pUid);
  1113. X#endif
  1114. X
  1115. X    fData = getflonum(xlgaflonum());
  1116. X
  1117. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  1118. X
  1119. X
  1120. X    /** check for this uid already in table...
  1121. X     ** if so, just update data
  1122. X     **/
  1123. X    for (pNode = fbase_pHashes[iHashTab][iHashIndex];
  1124. X     pNode;
  1125. X     pNode = pNode->pNext) {
  1126. X    
  1127. X    if (FBASE_HASH_HIT(pUid, pNode)) {
  1128. X        pNode->fData = fData;
  1129. X        pReturn = true;
  1130. X        break;
  1131. X        }
  1132. X    }
  1133. X
  1134. X    /** uid not found, add new hash entry.
  1135. X     **/
  1136. X    if (pReturn == NIL) {
  1137. X
  1138. X    if (Shell_NewBlock(sizeof(TStampEntRec), 
  1139. X               &pNode, "fern-hash-node") == VEOS_SUCCESS) {
  1140. X        
  1141. X        strcpy(pNode->sHost, getstring(getelement(pUid, 0)));
  1142. X        pNode->iPort = getfixnum(getelement(pUid, 1));
  1143. X        pNode->fData = fData;
  1144. X        
  1145. X        pNode->pNext = fbase_pHashes[iHashTab][iHashIndex];
  1146. X        fbase_pHashes[iHashTab][iHashIndex] = pNode;
  1147. X        
  1148. X        pReturn = true;
  1149. X        }
  1150. X    }
  1151. X
  1152. X    return(pReturn);
  1153. X    }
  1154. X/*--------------------------------------------------------------------------------*/
  1155. X
  1156. X
  1157. X/*--------------------------------------------------------------------------------*/
  1158. X/* args: hash-table-index, uid
  1159. X */
  1160. XLVAL Fbase_Hash_RemoveUid()
  1161. X{
  1162. X    LVAL        pReturn = NIL, pUid;
  1163. X    int            i, iHashTab, iHashIndex;
  1164. X    THStampEntRec    hFinger;
  1165. X    TPStampEntRec    pSave;
  1166. X
  1167. X    iHashTab = getfixnum(xlgafixnum());
  1168. X
  1169. X    pUid = xlgavector();
  1170. X    if (!IsUidElt(pUid))
  1171. X    xlbadtype(pUid);
  1172. X
  1173. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  1174. X    for (hFinger = &(fbase_pHashes[iHashTab][iHashIndex]);
  1175. X     *hFinger;
  1176. X     hFinger = &(*hFinger)->pNext) {
  1177. X
  1178. X    if (FBASE_HASH_HIT(pUid, *hFinger)) {
  1179. X        pSave = *hFinger;
  1180. X        *hFinger = pSave->pNext;
  1181. X        Shell_ReturnBlock(pSave, sizeof(TStampEntRec), "fern-hash-node");
  1182. X        pReturn = true;
  1183. X        break;
  1184. X        }
  1185. X    }
  1186. X
  1187. X    return(pReturn);
  1188. X    }
  1189. X/*--------------------------------------------------------------------------------*/
  1190. X
  1191. X
  1192. X/*--------------------------------------------------------------------------------*/
  1193. X/* args: hash-table-index, uid, float-to-place-data.
  1194. X * returns: true or NIL
  1195. X */
  1196. XLVAL Fbase_Hash_HashUid()
  1197. X{
  1198. X    LVAL        pReturn = NIL, pUid, pData;
  1199. X    int            i, iHashTab, iHashIndex;
  1200. X    TPStampEntRec    pFinger;
  1201. X
  1202. X    iHashTab = getfixnum(xlgafixnum());
  1203. X
  1204. X    pUid = xlgavector();
  1205. X    if (!IsUidElt(pUid))
  1206. X    xlbadtype(pUid);
  1207. X
  1208. X    pData = xlgaflonum();
  1209. X
  1210. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  1211. X    for (pFinger = fbase_pHashes[iHashTab][iHashIndex];
  1212. X     pFinger;
  1213. X     pFinger = pFinger->pNext) {
  1214. X    
  1215. X    if (FBASE_HASH_HIT(pUid, pFinger)) {
  1216. X        setflonum(pData, pFinger->fData);
  1217. X        pReturn = true;
  1218. X        break;
  1219. X        }
  1220. X    }
  1221. X
  1222. X    return(pReturn);
  1223. X    }
  1224. X/*--------------------------------------------------------------------------------*/
  1225. X
  1226. X
  1227. X/*--------------------------------------------------------------------------------*/
  1228. XLVAL Fbase_Init_CopyIntSubs()
  1229. X{
  1230. X    TVeosErr        iErr;
  1231. X
  1232. X    iErr = Native_GetPatternArg(&fbase_pbCopyIntSubs.pPatGr, NANCY_CopyMatch);
  1233. X
  1234. X    return(iErr == VEOS_SUCCESS ? true : NIL);
  1235. X    }
  1236. X/*--------------------------------------------------------------------------------*/
  1237. X
  1238. X
  1239. X
  1240. X/*--------------------------------------------------------------------------------*/
  1241. XLVAL Fbase_CopyIntSubs()
  1242. X{
  1243. X    TVeosErr        iErr;
  1244. X    LVAL        pReturn;
  1245. X    TTimeStamp        tTest;
  1246. X
  1247. X
  1248. X    /** look for optional time-stamp-test **/
  1249. X
  1250. X    NATIVE_TIME_ARG(fbase_pbCopyIntSubs.pTestTime, tTest);
  1251. X
  1252. X
  1253. X    /** dispatch the matcher **/
  1254. X
  1255. X    xlsave1(fbase_pbCopyIntSubs.pXResult);
  1256. X    
  1257. X    Native_XMandR(&fbase_pbCopyIntSubs);
  1258. X
  1259. X    xlpop();
  1260. X
  1261. X    pReturn = consp(fbase_pbCopyIntSubs.pXResult) ?
  1262. X    car(fbase_pbCopyIntSubs.pXResult) : fbase_pbCopyIntSubs.pXResult;
  1263. X
  1264. X    return(pReturn);
  1265. X    }
  1266. X/*--------------------------------------------------------------------------------*/
  1267. X
  1268. X
  1269. X/*--------------------------------------------------------------------------------*/
  1270. XLVAL Fbase_Init_CopyBndryVrt()
  1271. X{
  1272. X    TVeosErr        iErr;
  1273. X
  1274. X    iErr = Native_GetPatternArg(&fbase_pbCopyBndryVrt.pPatGr, NANCY_CopyMatch);
  1275. X
  1276. X    return(iErr == VEOS_SUCCESS ? true : NIL);
  1277. X    }
  1278. X/*--------------------------------------------------------------------------------*/
  1279. X
  1280. X
  1281. X
  1282. X/*--------------------------------------------------------------------------------*/
  1283. XLVAL Fbase_CopyBndryVrt()
  1284. X{
  1285. X    TVeosErr        iErr;
  1286. X    LVAL        pReturn;
  1287. X    TTimeStamp        tTest;
  1288. X
  1289. X
  1290. X    /** look for optional time-stamp-test **/
  1291. X
  1292. X    NATIVE_TIME_ARG(fbase_pbCopyBndryVrt.pTestTime, tTest);
  1293. X
  1294. X
  1295. X    /** dispatch the matcher **/
  1296. X
  1297. X    xlsave1(fbase_pbCopyBndryVrt.pXResult);
  1298. X    
  1299. X    Native_XMandR(&fbase_pbCopyBndryVrt);
  1300. X
  1301. X    xlpop();
  1302. X
  1303. X    pReturn = consp(fbase_pbCopyBndryVrt.pXResult) ?
  1304. X    car(fbase_pbCopyBndryVrt.pXResult) : fbase_pbCopyBndryVrt.pXResult;
  1305. X
  1306. X    return(pReturn);
  1307. X    }
  1308. X/*--------------------------------------------------------------------------------*/
  1309. X
  1310. X
  1311. X/*--------------------------------------------------------------------------------*
  1312. X           Beuratrcatic Linkage Between Fern Prims and XLISP
  1313. X *--------------------------------------------------------------------------------*/
  1314. X
  1315. X
  1316. X/*--------------------------------------------------------------------------------*/
  1317. XTVeosErr Fern_LoadPrims()
  1318. X{
  1319. X#define FERN_LOAD
  1320. X#include "fern_prims.h"
  1321. X#define FERN_LOAD
  1322. X    }
  1323. X/*--------------------------------------------------------------------------------*/
  1324. X
  1325. X
  1326. X
  1327. X/*--------------------------------------------------------------------------------*
  1328. X                   Private Functions
  1329. X *--------------------------------------------------------------------------------*/
  1330. X
  1331. X
  1332. X/*--------------------------------------------------------------------------------*/
  1333. XTVeosErr Fbase_()
  1334. X{
  1335. X    TVeosErr        iErr;
  1336. X
  1337. X    return(iErr);
  1338. X    }
  1339. X/*--------------------------------------------------------------------------------*/
  1340. X
  1341. X
  1342. X
  1343. X/*--------------------------------------------------------------------------------*/
  1344. Xvoid Fbase_Frame()
  1345. X{
  1346. X    LVAL        pMsg;
  1347. X
  1348. X
  1349. X    /** pass time to veos kernel for accounting.
  1350. X     **/
  1351. X    Kernel_SystemTask();
  1352. X
  1353. X
  1354. X    for (Native_NextMsg(&pMsg);
  1355. X     pMsg;
  1356. X     Native_NextMsg(&pMsg)) {
  1357. X
  1358. X    /** invoke normal lisp evaluator on message. 
  1359. X     **/ 
  1360. X    xlxeval(pMsg); 
  1361. X
  1362. X    /** at top of loop, when msgVar is set to next msg, 
  1363. X     ** old contents of msgVar are detached from any protected xlisp ptr, 
  1364. X     ** thus it will be garbage collected. 
  1365. X     **/ 
  1366. X    } 
  1367. X
  1368. X    /** do the persist procs. 
  1369. X     **/ 
  1370. X    if (!null(getvalue(s_pPersistProcs)))
  1371. X    xleval(getvalue(s_pPersistFunc));
  1372. X    }
  1373. X/*--------------------------------------------------------------------------------*/
  1374. X
  1375. X
  1376. X
  1377. X/*--------------------------------------------------------------------------------*/
  1378. XTVeosErr Fbase_InitMatcherPBs()
  1379. X{
  1380. X    /** copy-int-subs settings **/
  1381. X    
  1382. X    fbase_pbCopyIntSubs.pSrcGr = WORK_SPACE;
  1383. X    fbase_pbCopyIntSubs.iDestroyFlag = NANCY_CopyMatch;
  1384. X    fbase_pbCopyIntSubs.pXReplaceElt = nil;
  1385. X    fbase_pbCopyIntSubs.pStampTime = nil;
  1386. X
  1387. X    /** copy-bndry-vrt settings **/
  1388. X    
  1389. X    fbase_pbCopyBndryVrt.pSrcGr = WORK_SPACE;
  1390. X    fbase_pbCopyBndryVrt.iDestroyFlag = NANCY_CopyMatch;
  1391. X    fbase_pbCopyBndryVrt.pXReplaceElt = nil;
  1392. X    fbase_pbCopyBndryVrt.pStampTime = nil;
  1393. X
  1394. X    return(VEOS_SUCCESS);
  1395. X    
  1396. X    } /* Fbase_InitMatcherPBs */
  1397. X/*--------------------------------------------------------------------------------*/
  1398. X
  1399. X
  1400. X
  1401. END_OF_FILE
  1402. if test 11012 -ne `wc -c <'kernel_private/src/fern/fern.c'`; then
  1403.     echo shar: \"'kernel_private/src/fern/fern.c'\" unpacked with wrong size!
  1404. fi
  1405. # end of 'kernel_private/src/fern/fern.c'
  1406. fi
  1407. if test -f 'src/kernel_current/fern/fe_bnd.lsp' -a "${1}" != "-c" ; then 
  1408.   echo shar: Will not clobber existing file \"'src/kernel_current/fern/fe_bnd.lsp'\"
  1409. else
  1410. echo shar: Extracting \"'src/kernel_current/fern/fe_bnd.lsp'\" \(10935 characters\)
  1411. sed "s/^X//" >'src/kernel_current/fern/fe_bnd.lsp' <<'END_OF_FILE'
  1412. X;;-----------------------------------------------------------
  1413. X;; file: fe_bnd.lsp
  1414. X;;
  1415. X;; FERN is the Fractal Entity Relativity Node.
  1416. X;; Part of the FE component of the Fern System.
  1417. X;;
  1418. X;; creation: March 28, 1992
  1419. X;;
  1420. X;; by Geoffrey P. Coco at the HITLab, Seattle
  1421. X;;-----------------------------------------------------------
  1422. X
  1423. X
  1424. X;;-----------------------------------------------------------
  1425. X;; Copyright (C) 1992  Geoffrey P. Coco,
  1426. X;; Human Interface Technology Lab, Seattle
  1427. X;;-----------------------------------------------------------
  1428. X
  1429. X
  1430. X
  1431. X;;===========================================================
  1432. X;;              Boundary
  1433. X;;===========================================================
  1434. X
  1435. X(defun fe-put.bndry (bndry)
  1436. X  (vput bndry '((~ "perc"
  1437. X           @
  1438. X           > @
  1439. X           @) **)))
  1440. X
  1441. X;;-----------------------------------------------------------
  1442. X
  1443. X(defun fe-copy.bndry (&key (test-time nil))
  1444. X  (car (vcopy '(("perc"
  1445. X         @
  1446. X         > @
  1447. X         @) **)
  1448. X          :test-time test-time)))
  1449. X
  1450. X;;-----------------------------------------------------------
  1451. X
  1452. X(defun fe-xtrct.bndry ()
  1453. X  (vget '(("perc"
  1454. X       @
  1455. X       (> @@)
  1456. X       @) **)))
  1457. X
  1458. X;;-----------------------------------------------------------
  1459. X
  1460. X(defun fe-get.bndry ()
  1461. X  (car (vput "%" '((~ "perc"
  1462. X              @
  1463. X              > @
  1464. X              @) **))))
  1465. X
  1466. X;;-----------------------------------------------------------
  1467. X
  1468. X
  1469. X
  1470. X;;===========================================================
  1471. X;;               Virtual
  1472. X;;===========================================================
  1473. X
  1474. X;; returns old virtual bndry
  1475. X(defun fe-put.bndry.vrt (vbndry)
  1476. X  (car (vput vbndry '((~ "perc"
  1477. X             @
  1478. X             (@ > @ @)
  1479. X             @) **))))
  1480. X
  1481. X;;-----------------------------------------------------------
  1482. X
  1483. X;; cache this frequently used pattern in C level fern.
  1484. X;; later, calls to fe-copy.bndry.vrt use precomputed pattern.
  1485. X
  1486. X(fbase-init-copy.bndry.vrt '(("perc"
  1487. X                  @
  1488. X                  (@ > @ @)
  1489. X                  @) **))
  1490. X
  1491. X#|
  1492. X(defun fe-copy.bndry.vrt (&key (test-time nil))
  1493. X  (car (vcopy '(("perc"
  1494. X         @
  1495. X         (@ > @ @)
  1496. X         @) **)
  1497. X          :test-time test-time)))
  1498. X|#
  1499. X;;-----------------------------------------------------------
  1500. X
  1501. X(defun fe-xtrct.bndry.vrt ()
  1502. X  (vget '(("perc"
  1503. X       @
  1504. X       (@ (> @@) @)
  1505. X       @) **)))
  1506. X
  1507. X;;-----------------------------------------------------------
  1508. X
  1509. X(defun fe-get.bndry.vrt ()
  1510. X  (car (vput "%" '(("perc"
  1511. X            @
  1512. X            (@ > @ @)
  1513. X            @) **))))
  1514. X
  1515. X;;-----------------------------------------------------------
  1516. X
  1517. X
  1518. X
  1519. X;;===========================================================
  1520. X;;               Virtual Objects
  1521. X;;===========================================================
  1522. X
  1523. X(defun fe-jam.bndry.vrt.ob (ob)
  1524. X  (vput ob '((~ "perc"
  1525. X        @
  1526. X        (@ (^ @@) @)
  1527. X        @) **)))
  1528. X
  1529. X;;-----------------------------------------------------------
  1530. X
  1531. X;; objects are (ob-name (attr-list))
  1532. X(defun fe-put.bndry.vrt.ob (ob)
  1533. X  (cond
  1534. X
  1535. X   ;; assume object is already there
  1536. X   ((car (vput ob `((~ "perc"
  1537. X               @
  1538. X               (@ (> (,(car ob) @) **) @)
  1539. X               @) **))))
  1540. X
  1541. X   ;; object wasn't there, insert new one
  1542. X   ((fe-jam.bndry.vrt.ob ob))
  1543. X   ))
  1544. X
  1545. X;;-----------------------------------------------------------
  1546. X
  1547. X;; pass object name
  1548. X(defun fe-copy.bndry.vrt.ob (ob-name &key (test-time nil))
  1549. X  (car (vcopy `(("perc"
  1550. X         @
  1551. X         (@ (> (,ob-name @) **) @)
  1552. X         @) **)
  1553. X          :test-time test-time)))
  1554. X
  1555. X;;-----------------------------------------------------------
  1556. X
  1557. X(defun fe-xtrct.bndry.vrt.ob (ob-name)
  1558. X  (car (vget `(("perc"
  1559. X        @
  1560. X        (@ (> (,ob-name @) **) @)
  1561. X        @) **))))
  1562. X
  1563. X;;-----------------------------------------------------------
  1564. X
  1565. X(defun fe-get.bndry.vrt.ob (ob-name)
  1566. X  (car (vput "%" `((~ "perc"
  1567. X              @
  1568. X              (@ ((~ ,ob-name > @) **) @)
  1569. X              @) **))))
  1570. X
  1571. X;;-----------------------------------------------------------
  1572. X
  1573. X
  1574. X
  1575. X;;===========================================================
  1576. X;;          Virtual Object - Complex
  1577. X;;===========================================================
  1578. X
  1579. X(defun fe-copy.bndry.vrt.ob.names ()
  1580. X  (vcopy `(("perc"
  1581. X        @
  1582. X        (@ ((> @ @) **) @)
  1583. X        @) **)
  1584. X     :freq "all"))
  1585. X
  1586. X;;-----------------------------------------------------------
  1587. X
  1588. X
  1589. X
  1590. X
  1591. X;;===========================================================
  1592. X;;          Virtual Object Attributes
  1593. X;;===========================================================
  1594. X
  1595. X(defun fe-jam.bndry.vrt.ob.attr (ob-name attr)
  1596. X  (cond
  1597. X   ;; assume object exists, add new attr
  1598. X   ((vput attr `((~ "perc"
  1599. X            @
  1600. X            (@ ((~ ,ob-name (^ @@)) **) @)
  1601. X            @) **)))
  1602. X   
  1603. X   ;; object didn't exist, add new object with new attr.
  1604. X   ((fe-jam.bndry.vrt.ob `(,ob-name (,attr))))
  1605. X   ))
  1606. X
  1607. X;;-----------------------------------------------------------
  1608. X
  1609. X(defun fe-put.bndry.vrt.ob.attr (ob-name attr)
  1610. X  (cond
  1611. X
  1612. X   ;; assume the object and attr exist, swap in new attr
  1613. X   ((car (vput attr `((~ "perc"
  1614. X             @
  1615. X             (@ ((~ ,ob-name (> (,(car attr) @) **)) **) @)
  1616. X             @) **))))
  1617. X   
  1618. X   ;; attr didn't exist, add new attr
  1619. X   ((fe-jam.bndry.vrt.ob.attr ob-name attr))
  1620. X   ))
  1621. X
  1622. X;;-----------------------------------------------------------
  1623. X
  1624. X(defun fe-xtrct.bndry.vrt.ob.attr (ob-name attr-name)
  1625. X  (car (vget `(("perc"
  1626. X        @
  1627. X        (@ ((,ob-name (> (,attr-name @) **)) **) @)
  1628. X        @) **))))
  1629. X
  1630. X;;-----------------------------------------------------------
  1631. X
  1632. X(defun fe-get.bndry.vrt.ob.attr (ob-name attr-name)
  1633. X  (car (vput "%" `((~ "perc"
  1634. X              @
  1635. X              (@ ((~ ,ob-name ((~ ,attr-name > @) **)) **) @)
  1636. X              @) **))))
  1637. X
  1638. X;;-----------------------------------------------------------
  1639. X
  1640. X;; returns attr struct
  1641. X(defun fe-copy.bndry.vrt.ob.attr (ob-name attr-name &key (test-time nil))
  1642. X  (car (vcopy `(("perc"
  1643. X         @
  1644. X         (@ ((,ob-name (> (,attr-name @) **)) **) @)
  1645. X         @) **)
  1646. X          :test-time test-time)))
  1647. X  
  1648. X;;-----------------------------------------------------------
  1649. X
  1650. X
  1651. X
  1652. X;;===========================================================
  1653. X;;         Virtual Object Attributes - Complex
  1654. X;;===========================================================
  1655. X
  1656. X;; returns list of boundary attribute names
  1657. X(defun fe-copy.bndry.vrt.ob.attr.names (ob-name)
  1658. X  (vcopy `(("perc"
  1659. X        @
  1660. X        (@ ((,ob-name ((> @ @) **)) **) @)
  1661. X        @) **)
  1662. X     :freq "all"))
  1663. X
  1664. X;;-----------------------------------------------------------
  1665. X
  1666. X;; returns attr val
  1667. X(defun fe-copy.bndry.vrt.ob.attr.val (ob-name attr-name)
  1668. X  (car (vcopy `(("perc"
  1669. X         @
  1670. X         (@ ((,ob-name ((,attr-name > @) **)) **) @)
  1671. X         @) **))))
  1672. X  
  1673. X;;-----------------------------------------------------------
  1674. X
  1675. X
  1676. X
  1677. X
  1678. X;;===========================================================
  1679. X;;            Physical Sub-Partition
  1680. X;;===========================================================
  1681. X
  1682. X;; returns old physical bndry
  1683. X(defun fe-put.bndry.phys (vbndry)
  1684. X  (car (vput vbndry '((~ "perc"
  1685. X             @
  1686. X             (@2 > @)
  1687. X             @) **))))
  1688. X
  1689. X;;-----------------------------------------------------------
  1690. X
  1691. X(defun fe-copy.bndry.phys (&key (test-time nil))
  1692. X  (car (vcopy '(("perc"
  1693. X         @
  1694. X         (@2 > @)
  1695. X         @) **)
  1696. X          :test-time test-time)))
  1697. X
  1698. X;;-----------------------------------------------------------
  1699. X
  1700. X(defun fe-xtrct.bndry.phys ()
  1701. X  (vget '(("perc"
  1702. X       @
  1703. X       (@2 (> @@))
  1704. X       @) **)))
  1705. X
  1706. X;;-----------------------------------------------------------
  1707. X
  1708. X(defun fe-get.bndry.phys ()
  1709. X  (car (vput "%" '((~ "perc"
  1710. X              @
  1711. X              (@2 > @)
  1712. X              @) **))))
  1713. X
  1714. X;;-----------------------------------------------------------
  1715. X
  1716. X
  1717. X
  1718. X;;===========================================================
  1719. X;;               Physical Objects
  1720. X;;===========================================================
  1721. X
  1722. X(defun fe-jam.bndry.phys.ob (ob)
  1723. X  (vput ob '((~ "perc"
  1724. X        @
  1725. X        (@2 (^ @@))
  1726. X        @) **)))
  1727. X  
  1728. X;;-----------------------------------------------------------
  1729. X
  1730. X;; objects are (ob-name (attr-list))
  1731. X(defun fe-put.bndry.phys.ob (ob)
  1732. X  (cond
  1733. X
  1734. X   ;; assume object is already there
  1735. X   ((car (vput ob `((~ "perc"
  1736. X               @
  1737. X               (@2 (> (,(car ob) @) **))
  1738. X               @) **))))
  1739. X
  1740. X   ;; object wasn't there, insert new one
  1741. X   ((fe-jam.bndry.phys.ob ob))
  1742. X   ))
  1743. X
  1744. X;;-----------------------------------------------------------
  1745. X
  1746. X;; pass object name
  1747. X(defun fe-copy.bndry.phys.ob (ob-name &key (test-time nil))
  1748. X  (car (vcopy `(("perc"
  1749. X         @
  1750. X         (@2 (> (,ob-name @) **))
  1751. X         @) **)
  1752. X          :test-time test-time)))
  1753. X
  1754. X;;-----------------------------------------------------------
  1755. X
  1756. X(defun fe-xtrct.bndry.phys.ob (ob-name)
  1757. X  (car (vget `(("perc"
  1758. X        @
  1759. X        (@2 (> (,ob-name @) **))
  1760. X        @) **))))
  1761. X
  1762. X;;-----------------------------------------------------------
  1763. X
  1764. X(defun fe-get.bndry.phys.ob (ob-name)
  1765. X  (car (vput "%" `((~ "perc"
  1766. X              @
  1767. X              (@2 ((~ ,ob-name > @) **))
  1768. X              @) **))))
  1769. X
  1770. X;;-----------------------------------------------------------
  1771. X
  1772. X
  1773. X
  1774. X
  1775. X;;===========================================================
  1776. X;;          Physical Object - Complex
  1777. X;;===========================================================
  1778. X
  1779. X(defun fe-copy.bndry.phys.ob.names ()
  1780. X  (vcopy `(("perc"
  1781. X        @
  1782. X        (@2 ((> @ @) **))
  1783. X        @) **)
  1784. X     :freq "all"))
  1785. X
  1786. X;;-----------------------------------------------------------
  1787. X
  1788. X
  1789. X
  1790. X
  1791. X;;===========================================================
  1792. X;;          Physical Object Attributes
  1793. X;;===========================================================
  1794. X
  1795. X(defun fe-jam.bndry.phys.ob.attr (ob-name attr)
  1796. X  (cond
  1797. X   ;; assume object exists, add new attr
  1798. X   ((vput attr `((~ "perc"
  1799. X            @
  1800. X            (@2 ((~ ,ob-name (^ @@)) **))
  1801. X            @) **)))
  1802. X
  1803. X   ;; object didn't exist, add new object with new attr.
  1804. X   ((fe-jam.bndry.phys.ob `(,ob-name (,attr))))
  1805. X   ))
  1806. X
  1807. X;;-----------------------------------------------------------
  1808. X
  1809. X(defun fe-put.bndry.phys.ob.attr (ob-name attr)
  1810. X  (cond
  1811. X
  1812. X   ;; assume the object and attr exist, swap in new attr
  1813. X   ((car (vput attr `((~ "perc"
  1814. X             @
  1815. X             (@2 ((~ ,ob-name (> (,(car attr) @) **)) **))
  1816. X             @) **))))
  1817. X   
  1818. X   ;; attr didn't exist, add new attr
  1819. X   ((fe-jam.bndry.phys.ob.attr ob-name attr))
  1820. X   ))
  1821. X
  1822. X;;-----------------------------------------------------------
  1823. X
  1824. X(defun fe-xtrct.bndry.phys.ob.attr (ob-name attr-name)
  1825. X  (car (vget `(("perc"
  1826. X        @
  1827. X        (@2 ((,ob-name (> (,attr-name @) **)) **))
  1828. X        @) **))))
  1829. X
  1830. X;;-----------------------------------------------------------
  1831. X
  1832. X(defun fe-get.bndry.phys.ob.attr (ob-name attr-name)
  1833. X  (car (vput "%" `((~ "perc"
  1834. X              @
  1835. X              (@2 ((~ ,ob-name ((~ ,attr-name > @) **)) **))
  1836. X              @) **))))
  1837. X
  1838. X;;-----------------------------------------------------------
  1839. X
  1840. X;; returns attr struct
  1841. X(defun fe-copy.bndry.phys.ob.attr (ob-name attr-name &key (test-time nil))
  1842. X  (car (vcopy `(("perc"
  1843. X         @
  1844. X         (@2 ((,ob-name (> (,attr-name @) **)) **))
  1845. X         @) **)
  1846. X          :test-time test-time)))
  1847. X  
  1848. X;;-----------------------------------------------------------
  1849. X
  1850. X
  1851. X
  1852. X;;===========================================================
  1853. X;;         Physical Object Attributes - Complex
  1854. X;;===========================================================
  1855. X
  1856. X;; returns list of boundary attribute names
  1857. X(defun fe-copy.bndry.phys.ob.attr.names (ob-name)
  1858. X  (vcopy `(("perc"
  1859. X        @
  1860. X        (@2 ((,ob-name ((> @ @) **)) **))
  1861. X        @) **)
  1862. X     :freq "all"))
  1863. X
  1864. X;;-----------------------------------------------------------
  1865. X
  1866. X;; returns attr val
  1867. X(defun fe-copy.bndry.phys.ob.attr.val (ob-name attr-name)
  1868. X  (car (vcopy `(("perc"
  1869. X         @
  1870. X         (@2 ((,ob-name ((,attr-name > @) **)) **))
  1871. X         @) **))))
  1872. X  
  1873. X;;-----------------------------------------------------------
  1874. X
  1875. X
  1876. X
  1877. X
  1878. END_OF_FILE
  1879. if test 10935 -ne `wc -c <'src/kernel_current/fern/fe_bnd.lsp'`; then
  1880.     echo shar: \"'src/kernel_current/fern/fe_bnd.lsp'\" unpacked with wrong size!
  1881. fi
  1882. # end of 'src/kernel_current/fern/fe_bnd.lsp'
  1883. fi
  1884. if test -f 'src/kernel_current/fern/fe_ext.lsp' -a "${1}" != "-c" ; then 
  1885.   echo shar: Will not clobber existing file \"'src/kernel_current/fern/fe_ext.lsp'\"
  1886. else
  1887. echo shar: Extracting \"'src/kernel_current/fern/fe_ext.lsp'\" \(11360 characters\)
  1888. sed "s/^X//" >'src/kernel_current/fern/fe_ext.lsp' <<'END_OF_FILE'
  1889. X;;-----------------------------------------------------------
  1890. X;; file: fe_ext.lsp
  1891. X;;
  1892. X;; FERN is the Fractal Entity Relativity Node.
  1893. X;; Part of the FE component of the Fern System.
  1894. X;;
  1895. X;; creation: March 28, 1992
  1896. X;;
  1897. X;; by Geoffrey P. Coco at the HITLab, Seattle
  1898. X;;-----------------------------------------------------------
  1899. X
  1900. X
  1901. X;;-----------------------------------------------------------
  1902. X;; Copyright (C) 1992  Geoffrey P. Coco,
  1903. X;; Human Interface Technology Lab, Seattle
  1904. X;;-----------------------------------------------------------
  1905. X
  1906. X
  1907. X;;===========================================================
  1908. X;;              External
  1909. X;;===========================================================
  1910. X
  1911. X(defun fe-put.ext (ext)
  1912. X  (vput ext '((~ "perc"
  1913. X         > @
  1914. X         @
  1915. X         @) **)))
  1916. X
  1917. X;;-----------------------------------------------------------
  1918. X
  1919. X(defun fe-copy.ext (&key (test-time nil))
  1920. X  (car (vcopy '(("perc"
  1921. X         > @
  1922. X         @
  1923. X         @) **)
  1924. X          :test-time test-time)))
  1925. X
  1926. X;;-----------------------------------------------------------
  1927. X
  1928. X(defun fe-xtrct.ext ()
  1929. X  (vget '(("perc"
  1930. X       (> @@)
  1931. X       @
  1932. X       @) **)))
  1933. X
  1934. X;;-----------------------------------------------------------
  1935. X
  1936. X(defun fe-get.ext ()
  1937. X  (car (vput "%" '((~ "perc"
  1938. X              > @
  1939. X              @
  1940. X              @) **))))
  1941. X
  1942. X;;-----------------------------------------------------------
  1943. X
  1944. X
  1945. X
  1946. X;;===========================================================
  1947. X;;            Spaces Sub-Partition
  1948. X;;===========================================================
  1949. X
  1950. X;; returns old space-list
  1951. X(defun fe-put.ext.sps (sps)
  1952. X  (car (vput sps '((~ "perc"
  1953. X              (> @ @2)
  1954. X              @2) **))))
  1955. X
  1956. X;;-----------------------------------------------------------
  1957. X
  1958. X(defun fe-copy.ext.sps (&key (test-time nil))
  1959. X  (car (vcopy '(("perc"
  1960. X         (> @ @2)
  1961. X         @2) **)
  1962. X          :test-time test-time)))
  1963. X
  1964. X;;-----------------------------------------------------------
  1965. X
  1966. X(defun fe-xtrct.ext.sps ()
  1967. X  (vget '(("perc"
  1968. X       ((> @@) @2)
  1969. X       @2) **)))
  1970. X
  1971. X;;-----------------------------------------------------------
  1972. X
  1973. X(defun fe-get.ext.sps ()
  1974. X  (car (vput "%" '((~ "perc"
  1975. X              (> @ @2)
  1976. X              @2) **))))
  1977. X
  1978. X;;-----------------------------------------------------------
  1979. X
  1980. X
  1981. X;;===========================================================
  1982. X;;               Spaces Entities
  1983. X;;===========================================================
  1984. X
  1985. X;; an ent is (uid data)
  1986. X(defun fe-jam.ext.sps.ent (ent)
  1987. X  (vput ent '((~ "perc"
  1988. X         ((^ @@) @2)
  1989. X         @2) **)))
  1990. X
  1991. X;;-----------------------------------------------------------
  1992. X
  1993. X;; an ent is (uid data)
  1994. X(defun fe-put.ext.sps.ent (ent)
  1995. X  (cond
  1996. X   ;; assume the entity already exists, swap in new one
  1997. X   ((car (vput ent `((~ "perc"
  1998. X            ((> (,(car ent) @) **) @2)
  1999. X            @2) **))))
  2000. X
  2001. X   ;; entity didn' exist, insert new ent
  2002. X   ((fe-jam.ext.sps.ent ent))))
  2003. X
  2004. X;;-----------------------------------------------------------
  2005. X
  2006. X(defun fe-copy.ext.sps.ent (uid &key (test-time nil))
  2007. X  (car (vcopy `(("perc"
  2008. X         ((> (,uid @) **) @2)
  2009. X         @2) **)
  2010. X          :test-time test-time)))
  2011. X
  2012. X;;-----------------------------------------------------------
  2013. X
  2014. X(defun fe-xtrct.ext.sps.ent (uid)
  2015. X  (car (vget `(("perc"
  2016. X        ((> (,uid @) **) @2)
  2017. X        @2) **))))
  2018. X
  2019. X;;-----------------------------------------------------------
  2020. X
  2021. X(defun fe-get.ext.sps.ent (uid)
  2022. X  (car (vput "%" `((~ "perc"
  2023. X              (((~ ,uid > @) **) @2)
  2024. X              @2) **))))
  2025. X
  2026. X;;-----------------------------------------------------------
  2027. X
  2028. X
  2029. X
  2030. X;;===========================================================
  2031. X;;           Siblings Sub-Partition
  2032. X;;===========================================================
  2033. X
  2034. X;; returns old sib-list
  2035. X(defun fe-put.ext.sibs (sibs)
  2036. X  (car (vput sibs '((~ "perc"
  2037. X               (@ > @ @)
  2038. X               @2) **))))
  2039. X
  2040. X;;-----------------------------------------------------------
  2041. X
  2042. X(defun fe-copy.ext.sibs (&key (test-time nil))
  2043. X  (car (vcopy '(("perc"
  2044. X         (@ > @ @)
  2045. X         @2) **)
  2046. X          :test-time test-time)))
  2047. X
  2048. X;;-----------------------------------------------------------
  2049. X
  2050. X(defun fe-xtrct.ext.sibs ()
  2051. X  (vget '(("perc"
  2052. X       (@ (> @@) @)
  2053. X       @2) **)))
  2054. X
  2055. X;;-----------------------------------------------------------
  2056. X
  2057. X(defun fe-get.ext.sibs ()
  2058. X  (car (vput "%" '((~ "perc"
  2059. X              (@ > @ @)
  2060. X              @2) **))))
  2061. X
  2062. X;;-----------------------------------------------------------
  2063. X
  2064. X
  2065. X
  2066. X;;===========================================================
  2067. X;;              Siblings Entities
  2068. X;;===========================================================
  2069. X
  2070. X(defun fe-jam.ext.sibs.ent (ent)
  2071. X  (vput ent '((~ "perc"
  2072. X         (@ (^ @@) @)
  2073. X         @2) **)))
  2074. X   
  2075. X;;-----------------------------------------------------------
  2076. X
  2077. X;; sibling entities are in the form: (uid (virtual object list))
  2078. X(defun fe-put.ext.sibs.ent (ent)
  2079. X  (cond
  2080. X   ;; assume the ent exists, swap in new ent
  2081. X   ((car (vput ent `((~ "perc"
  2082. X            (@ (> (,(car ent) @) **) @)
  2083. X            @2) **))))
  2084. X   ;; the ent didn't exist, add new ent
  2085. X   ((fe-jam.ext.sibs.ent ent))
  2086. X   ))
  2087. X
  2088. X;;-----------------------------------------------------------
  2089. X
  2090. X(defun fe-copy.ext.sibs.ent (uid &key (test-time nil))
  2091. X  (car (vcopy `(("perc"
  2092. X         (@ (> (,uid @) **) @)
  2093. X         @2) **)
  2094. X          :test-time test-time)))
  2095. X
  2096. X;;-----------------------------------------------------------
  2097. X
  2098. X(defun fe-xtrct.ext.ents.ent (uid)
  2099. X  (car (vget `(("perc"
  2100. X        (@ (> (,uid @) **) @)
  2101. X        @2) **))))
  2102. X
  2103. X;;-----------------------------------------------------------
  2104. X
  2105. X(defun fe-get.ext.ents.ent (uid)
  2106. X  (car (vput "%" `((~ "perc"
  2107. X              (@ ((~ ,uid > @) **) @)
  2108. X              @2) **))))
  2109. X
  2110. X;;-----------------------------------------------------------
  2111. X
  2112. X
  2113. X
  2114. X;;===========================================================
  2115. X;;         Siblings Entities - Complex
  2116. X;;===========================================================
  2117. X
  2118. X;; returns list of all external sibs' uids
  2119. X(defun fe-copy.ext.sibs.uids ()
  2120. X  (vcopy '(("perc"
  2121. X        (@ ((> @ @) **) @)
  2122. X        @2) **)
  2123. X     :freq "all"))
  2124. X
  2125. X;;-----------------------------------------------------------
  2126. X
  2127. X
  2128. X
  2129. X
  2130. X;;===========================================================
  2131. X;;          Sibling Entities Objects
  2132. X;;===========================================================
  2133. X
  2134. X(defun fe-jam.ext.sibs.ent.ob (uid ob)
  2135. X  (cond
  2136. X
  2137. X   ;; assume entity exists, insert new object
  2138. X   ((vput ob `((~ "perc"
  2139. X          (@ ((~ ,uid (^ @@)) **) @)
  2140. X          @2) **)))
  2141. X
  2142. X   ;; entity wasn't there, insert new entity with new object
  2143. X   ((fe-jam.ext.sibs.ent `(,uid (,ob))))
  2144. X   ))
  2145. X   
  2146. X;;-----------------------------------------------------------
  2147. X
  2148. X;; ob is a normal object structure: (name (attr-list))
  2149. X(defun fe-put.ext.sibs.ent.ob (uid ob)
  2150. X  (cond
  2151. X
  2152. X   ;; assume entity and object exist, swap in new object
  2153. X   ((car (vput ob `((~ "perc"
  2154. X               (@ ((~ ,uid (> (,(car ob) @) **)) **) @)
  2155. X               @2) **))))
  2156. X   
  2157. X   ;; object wasn't there, assume entity exists, insert new object
  2158. X   ((fe-jam.ext.sibs.ent.ob uid ob))
  2159. X   ))
  2160. X   
  2161. X;;-----------------------------------------------------------
  2162. X
  2163. X(defun fe-copy.ext.sibs.ent.ob (uid ob-name &key (test-time nil))
  2164. X  (car (vcopy `(("perc"
  2165. X         (@ ((,uid (> (,ob-name @) **)) **) @)
  2166. X         @2) **)
  2167. X          :test-time test-time)))
  2168. X
  2169. X;;-----------------------------------------------------------
  2170. X
  2171. X(defun fe-xtrct.ext.sibs.ent.ob (uid ob-name)
  2172. X  (car (vget `(("perc"
  2173. X        (@ ((,uid (> (,ob-name @) **)) **) @)
  2174. X        @2) **))))
  2175. X
  2176. X;;-----------------------------------------------------------
  2177. X
  2178. X(defun fe-get.ext.sibs.ent.ob (uid ob-name)
  2179. X  (car (vput "%" `((~ "perc"
  2180. X              (@ ((~ ,uid ((~ ,ob-name > @) **)) **) @)
  2181. X              @2) **))))
  2182. X
  2183. X;;-----------------------------------------------------------
  2184. X
  2185. X
  2186. X
  2187. X;;===========================================================
  2188. X;;         Sibling Entities Objects - Complex
  2189. X;;===========================================================
  2190. X
  2191. X;; pass uid, get list of it's ob names
  2192. X(defun fe-copy.ext.sibs.ent.ob.names (uid)
  2193. X  (vcopy `(("perc"
  2194. X        (@ ((,uid ((> @ @) **)) **) @)
  2195. X        @2) **)
  2196. X     :freq "all"))
  2197. X
  2198. X;;-----------------------------------------------------------
  2199. X
  2200. X
  2201. X
  2202. X;;===========================================================
  2203. X;;         Sibling Entities Objects Attributes
  2204. X;;===========================================================
  2205. X
  2206. X
  2207. X(defun fe-jam.ext.sibs.ent.ob.attr (uid ob-name attr)
  2208. X  (cond
  2209. X   ;; assume entity and ob exists, insert new attr
  2210. X   ((vput attr `((~ "perc"
  2211. X          (@
  2212. X           ((~ ,uid ((~ ,ob-name (^ @@)) **)) **)
  2213. X           @)
  2214. X          @2) **)))
  2215. X  
  2216. X   ;; ob wasn't there, insert new ob with new attr
  2217. X   ((fe-jam.ext.sibs.ent.ob uid `(,ob-name (,attr))))
  2218. X   ))
  2219. X
  2220. X;;-----------------------------------------------------------
  2221. X
  2222. X;; attr is ("attr-name" attr-val)
  2223. X(defun fe-put.ext.sibs.ent.ob.attr (uid ob-name attr)
  2224. X  (cond
  2225. X   ;; assume the ent, ob and attr exist, swap in new attr
  2226. X   ((car (vput attr `((~ "perc"
  2227. X             (@ 
  2228. X              ((~ ,uid ((~ ,ob-name (> (,(car attr) @) **)) **)) **)
  2229. X              @)
  2230. X             @2) **))))
  2231. X
  2232. X   ;; attr wasn't there, insert new attr
  2233. X   ((fe-jam.ext.sibs.ent.ob.attr uid ob-name attr))
  2234. X   ))
  2235. X   
  2236. X;;-----------------------------------------------------------
  2237. X
  2238. X;; pass uid, ob-num, attr-name
  2239. X(defun fe-copy.ext.sibs.ent.ob.attr (uid ob-num attr-name &key (test-time nil))
  2240. X  (car (vcopy `(("perc"
  2241. X         (@
  2242. X          ((,uid ((,ob-num (> (,attr-name @) **)) **)) **)
  2243. X          @)
  2244. X         @2) **)
  2245. X          :test-time test-time)))
  2246. X
  2247. X;;-----------------------------------------------------------
  2248. X
  2249. X;; pass uid, ob-num, attr-name
  2250. X(defun fe-xtrct.ext.sibs.ent.ob.attr (uid ob-num attr-name)
  2251. X  (car (vget `(("perc"
  2252. X        (@
  2253. X         ((,uid ((,ob-num (> (,attr-name @) **)) **)) **)
  2254. X         @)
  2255. X        @2) **))))
  2256. X
  2257. X;;-----------------------------------------------------------
  2258. X
  2259. X;; pass uid, ob-num, attr-name
  2260. X(defun fe-get.ext.sibs.ent.ob.attr (uid ob-num attr-name)
  2261. X  (car (vput "%" `((~ "perc"
  2262. X            (@
  2263. X             ((~ ,uid ((~ ,ob-num ((~ ,attr-name > @) **)) **)) **)
  2264. X             @)
  2265. X            @2) **))))
  2266. X
  2267. X;;-----------------------------------------------------------
  2268. X
  2269. X
  2270. X;;===========================================================
  2271. X;;    Sibling Entities Objects Attributes - Complex
  2272. X;;===========================================================
  2273. X
  2274. X;; pass uid and ob, return attr-list
  2275. X(defun fe-copy.ext.sibs.ent.ob.attr.names (uid ob-name)
  2276. X  (vcopy `(("perc"
  2277. X        (@
  2278. X         ((,uid ((,ob-name ((> @ @) **)) **)) **)
  2279. X         @)
  2280. X        @2) **)
  2281. X     :freq "all"))
  2282. X
  2283. X;;-----------------------------------------------------------
  2284. X
  2285. X;; pass attr, return values of all objects of all sibs
  2286. X(defun fe-copy.ext.sibs.attr.vals (attr-name)
  2287. X  (vcopy `(("perc"
  2288. X        (@
  2289. X         ((@ ((@ ((,attr-name > @) **)) **)) **)
  2290. X         @)
  2291. X        @2) **)
  2292. X     :freq "all"))
  2293. X
  2294. X;;-----------------------------------------------------------
  2295. X
  2296. X;; pass uid, ob-num, attr-name
  2297. X(defun fe-copy.ext.sibs.ent.ob.attr.val (uid ob-num attr-name)
  2298. X  (car (vcopy `(("perc"
  2299. X         (@
  2300. X          ((,uid ((,ob-num ((,attr-name > @) **)) **)) **)
  2301. X          @)
  2302. X         @2) **))))
  2303. X
  2304. X;;-----------------------------------------------------------
  2305. X
  2306. X
  2307. X
  2308. X
  2309. X;;===========================================================
  2310. X;;            Filters Sub-Partition
  2311. X;;===========================================================
  2312. X
  2313. X;; filters are ("attr" (inclusion-list))
  2314. X(defun fe-put.ext.fltrs (fltrs)
  2315. X  (vput fltrs '((~ "perc"
  2316. X           (@2 > @)
  2317. X           @2) **)))
  2318. X
  2319. X;;-----------------------------------------------------------
  2320. X
  2321. X(defun fe-copy.ext.fltrs (&key (test-time nil))
  2322. X  (car (vcopy '(("perc"
  2323. X         (@2 > @)
  2324. X         @2) **)
  2325. X          :test-time test-time)))
  2326. X
  2327. X;;-----------------------------------------------------------
  2328. X
  2329. X(defun fe-xtrct.ext.fltrs ()
  2330. X  (vget '(("perc"
  2331. X       (@2 (> @@))
  2332. X       @2) **)))
  2333. X
  2334. X;;-----------------------------------------------------------
  2335. X
  2336. X(defun fe-get.ext.fltrs ()
  2337. X  (car (vput "%" '((~ "perc"
  2338. X              (@2 > @)
  2339. X              @2) **))))
  2340. X
  2341. X;;-----------------------------------------------------------
  2342. END_OF_FILE
  2343. if test 11360 -ne `wc -c <'src/kernel_current/fern/fe_ext.lsp'`; then
  2344.     echo shar: \"'src/kernel_current/fern/fe_ext.lsp'\" unpacked with wrong size!
  2345. fi
  2346. # end of 'src/kernel_current/fern/fe_ext.lsp'
  2347. fi
  2348. if test -f 'src/kernel_current/fern/fern.c' -a "${1}" != "-c" ; then 
  2349.   echo shar: Will not clobber existing file \"'src/kernel_current/fern/fern.c'\"
  2350. else
  2351. echo shar: Extracting \"'src/kernel_current/fern/fern.c'\" \(11012 characters\)
  2352. sed "s/^X//" >'src/kernel_current/fern/fern.c' <<'END_OF_FILE'
  2353. X/****************************************************************************************
  2354. X * file: fern.c                                        *
  2355. X *                                            *
  2356. X * February 25, 1992: implementation of the Fractal Entity Relativity Node for veos.    *
  2357. X *                                                    *
  2358. X * by Geoffrey P. Coco at the HITLab, Seattle.                          *
  2359. X *                                            *
  2360. X ****************************************************************************************/
  2361. X
  2362. X/****************************************************************************************
  2363. X * Copyright (C) 1992  Human Interface Technology Lab, Seattle                *
  2364. X ****************************************************************************************/
  2365. X
  2366. X
  2367. X/*--------------------------------------------------------------------------------*
  2368. X                 Preliminaries
  2369. X *--------------------------------------------------------------------------------*/
  2370. X
  2371. X
  2372. X#include "xlisp.h"
  2373. X#include "kernel.h"
  2374. X#include "xv_native.h"
  2375. X#include "fern.h"
  2376. X
  2377. X#include <math.h>
  2378. X
  2379. X/*--------------------------------------------------------------------------------*/
  2380. X
  2381. Xboolean        fbase_bInit = FALSE;
  2382. Xboolean        fbase_bGoing = FALSE;
  2383. XLVAL        s_pPersistFunc, s_pPersistProcs;
  2384. XTStampEntHash    fbase_pHashes[5];
  2385. Xint        fbase_iHashFree;
  2386. XTXMandRRec    fbase_pbCopyIntSubs;
  2387. XTXMandRRec    fbase_pbCopyBndryVrt;
  2388. X
  2389. X/*--------------------------------------------------------------------------------*/
  2390. X
  2391. Xvoid Fbase_Frame();
  2392. XTVeosErr Fbase_InitMatcherPBs();
  2393. X
  2394. X/*--------------------------------------------------------------------------------*/
  2395. X
  2396. X
  2397. X/*--------------------------------------------------------------------------------*
  2398. X                 Lisp Interface To Fern
  2399. X *--------------------------------------------------------------------------------*/
  2400. X
  2401. X
  2402. X/*--------------------------------------------------------------------------------*/
  2403. XLVAL Fbase_Init()
  2404. X{
  2405. X    if (!fbase_bInit) {
  2406. X
  2407. X    /** make permanent xlisp symbol to contain persist function call **/
  2408. X    
  2409. X    s_pPersistFunc = xlenter("FC-PRS-NTRY");
  2410. X    setvalue(s_pPersistFunc, cons(xlenter("FCON-PERSIST"), NIL));
  2411. X
  2412. X    s_pPersistProcs = xlenter("PERSIST-PROCS");
  2413. X
  2414. X    fbase_iHashFree = 0;
  2415. X
  2416. X    Fbase_InitMatcherPBs();
  2417. X    }
  2418. X
  2419. X    return(true);
  2420. X    }
  2421. X/*--------------------------------------------------------------------------------*/
  2422. X
  2423. X
  2424. X
  2425. X/*--------------------------------------------------------------------------------*/
  2426. XLVAL Fbase_fcon_time()
  2427. X{
  2428. X    xllastarg();
  2429. X
  2430. X    Fbase_Frame();
  2431. X
  2432. X    return(true);
  2433. X    } 
  2434. X/*--------------------------------------------------------------------------------*/
  2435. X
  2436. X
  2437. X/*--------------------------------------------------------------------------------*/
  2438. XLVAL Fbase_fcon_go()
  2439. X{
  2440. X    xllastarg();
  2441. X
  2442. X    fbase_bGoing = TRUE;
  2443. X    while (fbase_bGoing)
  2444. X    Fbase_Frame();
  2445. X
  2446. X    return(true);
  2447. X    }
  2448. X/*--------------------------------------------------------------------------------*/
  2449. X
  2450. X
  2451. X/*--------------------------------------------------------------------------------*/
  2452. XLVAL Fbase_fcon_local_ungo()
  2453. X{
  2454. X    xllastarg();
  2455. X
  2456. X    fbase_bGoing = FALSE;
  2457. X
  2458. X    return(true);
  2459. X    }
  2460. X/*--------------------------------------------------------------------------------*/
  2461. X
  2462. X
  2463. X/*--------------------------------------------------------------------------------*/
  2464. X/* returns: hash-table-index of new fern maintained hash table
  2465. X */
  2466. XLVAL Fbase_Hash_NewTab()
  2467. X{
  2468. X    int        i, iHashTab;
  2469. X    
  2470. X    iHashTab = fbase_iHashFree++;
  2471. X    for (i=0; i<12; i++)
  2472. X    fbase_pHashes[iHashTab][i] = nil;
  2473. X
  2474. X    return(cvfixnum(iHashTab));
  2475. X    }
  2476. X/*--------------------------------------------------------------------------------*/
  2477. X
  2478. X
  2479. X/*--------------------------------------------------------------------------------*/
  2480. X/* args: hash-table-refnum, new-uid, initial-float-data 
  2481. X */
  2482. XLVAL Fbase_Hash_AddUid()
  2483. X{
  2484. X    LVAL        pReturn = NIL, pUid;
  2485. X    int            i, iHashTab, iHashIndex;
  2486. X    float            fData;
  2487. X    TPStampEntRec    pNode, pFinger;
  2488. X
  2489. X    iHashTab = getfixnum(xlgafixnum());
  2490. X
  2491. X    pUid = xlgavector();
  2492. X#ifndef OPTIMAL
  2493. X    if (!IsUidElt(pUid))
  2494. X    xlbadtype(pUid);
  2495. X#endif
  2496. X
  2497. X    fData = getflonum(xlgaflonum());
  2498. X
  2499. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  2500. X
  2501. X
  2502. X    /** check for this uid already in table...
  2503. X     ** if so, just update data
  2504. X     **/
  2505. X    for (pNode = fbase_pHashes[iHashTab][iHashIndex];
  2506. X     pNode;
  2507. X     pNode = pNode->pNext) {
  2508. X    
  2509. X    if (FBASE_HASH_HIT(pUid, pNode)) {
  2510. X        pNode->fData = fData;
  2511. X        pReturn = true;
  2512. X        break;
  2513. X        }
  2514. X    }
  2515. X
  2516. X    /** uid not found, add new hash entry.
  2517. X     **/
  2518. X    if (pReturn == NIL) {
  2519. X
  2520. X    if (Shell_NewBlock(sizeof(TStampEntRec), 
  2521. X               &pNode, "fern-hash-node") == VEOS_SUCCESS) {
  2522. X        
  2523. X        strcpy(pNode->sHost, getstring(getelement(pUid, 0)));
  2524. X        pNode->iPort = getfixnum(getelement(pUid, 1));
  2525. X        pNode->fData = fData;
  2526. X        
  2527. X        pNode->pNext = fbase_pHashes[iHashTab][iHashIndex];
  2528. X        fbase_pHashes[iHashTab][iHashIndex] = pNode;
  2529. X        
  2530. X        pReturn = true;
  2531. X        }
  2532. X    }
  2533. X
  2534. X    return(pReturn);
  2535. X    }
  2536. X/*--------------------------------------------------------------------------------*/
  2537. X
  2538. X
  2539. X/*--------------------------------------------------------------------------------*/
  2540. X/* args: hash-table-index, uid
  2541. X */
  2542. XLVAL Fbase_Hash_RemoveUid()
  2543. X{
  2544. X    LVAL        pReturn = NIL, pUid;
  2545. X    int            i, iHashTab, iHashIndex;
  2546. X    THStampEntRec    hFinger;
  2547. X    TPStampEntRec    pSave;
  2548. X
  2549. X    iHashTab = getfixnum(xlgafixnum());
  2550. X
  2551. X    pUid = xlgavector();
  2552. X    if (!IsUidElt(pUid))
  2553. X    xlbadtype(pUid);
  2554. X
  2555. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  2556. X    for (hFinger = &(fbase_pHashes[iHashTab][iHashIndex]);
  2557. X     *hFinger;
  2558. X     hFinger = &(*hFinger)->pNext) {
  2559. X
  2560. X    if (FBASE_HASH_HIT(pUid, *hFinger)) {
  2561. X        pSave = *hFinger;
  2562. X        *hFinger = pSave->pNext;
  2563. X        Shell_ReturnBlock(pSave, sizeof(TStampEntRec), "fern-hash-node");
  2564. X        pReturn = true;
  2565. X        break;
  2566. X        }
  2567. X    }
  2568. X
  2569. X    return(pReturn);
  2570. X    }
  2571. X/*--------------------------------------------------------------------------------*/
  2572. X
  2573. X
  2574. X/*--------------------------------------------------------------------------------*/
  2575. X/* args: hash-table-index, uid, float-to-place-data.
  2576. X * returns: true or NIL
  2577. X */
  2578. XLVAL Fbase_Hash_HashUid()
  2579. X{
  2580. X    LVAL        pReturn = NIL, pUid, pData;
  2581. X    int            i, iHashTab, iHashIndex;
  2582. X    TPStampEntRec    pFinger;
  2583. X
  2584. X    iHashTab = getfixnum(xlgafixnum());
  2585. X
  2586. X    pUid = xlgavector();
  2587. X    if (!IsUidElt(pUid))
  2588. X    xlbadtype(pUid);
  2589. X
  2590. X    pData = xlgaflonum();
  2591. X
  2592. X    iHashIndex = FBASE_HASH_HOST(getstring(getelement(pUid, 0)));
  2593. X    for (pFinger = fbase_pHashes[iHashTab][iHashIndex];
  2594. X     pFinger;
  2595. X     pFinger = pFinger->pNext) {
  2596. X    
  2597. X    if (FBASE_HASH_HIT(pUid, pFinger)) {
  2598. X        setflonum(pData, pFinger->fData);
  2599. X        pReturn = true;
  2600. X        break;
  2601. X        }
  2602. X    }
  2603. X
  2604. X    return(pReturn);
  2605. X    }
  2606. X/*--------------------------------------------------------------------------------*/
  2607. X
  2608. X
  2609. X/*--------------------------------------------------------------------------------*/
  2610. XLVAL Fbase_Init_CopyIntSubs()
  2611. X{
  2612. X    TVeosErr        iErr;
  2613. X
  2614. X    iErr = Native_GetPatternArg(&fbase_pbCopyIntSubs.pPatGr, NANCY_CopyMatch);
  2615. X
  2616. X    return(iErr == VEOS_SUCCESS ? true : NIL);
  2617. X    }
  2618. X/*--------------------------------------------------------------------------------*/
  2619. X
  2620. X
  2621. X
  2622. X/*--------------------------------------------------------------------------------*/
  2623. XLVAL Fbase_CopyIntSubs()
  2624. X{
  2625. X    TVeosErr        iErr;
  2626. X    LVAL        pReturn;
  2627. X    TTimeStamp        tTest;
  2628. X
  2629. X
  2630. X    /** look for optional time-stamp-test **/
  2631. X
  2632. X    NATIVE_TIME_ARG(fbase_pbCopyIntSubs.pTestTime, tTest);
  2633. X
  2634. X
  2635. X    /** dispatch the matcher **/
  2636. X
  2637. X    xlsave1(fbase_pbCopyIntSubs.pXResult);
  2638. X    
  2639. X    Native_XMandR(&fbase_pbCopyIntSubs);
  2640. X
  2641. X    xlpop();
  2642. X
  2643. X    pReturn = consp(fbase_pbCopyIntSubs.pXResult) ?
  2644. X    car(fbase_pbCopyIntSubs.pXResult) : fbase_pbCopyIntSubs.pXResult;
  2645. X
  2646. X    return(pReturn);
  2647. X    }
  2648. X/*--------------------------------------------------------------------------------*/
  2649. X
  2650. X
  2651. X/*--------------------------------------------------------------------------------*/
  2652. XLVAL Fbase_Init_CopyBndryVrt()
  2653. X{
  2654. X    TVeosErr        iErr;
  2655. X
  2656. X    iErr = Native_GetPatternArg(&fbase_pbCopyBndryVrt.pPatGr, NANCY_CopyMatch);
  2657. X
  2658. X    return(iErr == VEOS_SUCCESS ? true : NIL);
  2659. X    }
  2660. X/*--------------------------------------------------------------------------------*/
  2661. X
  2662. X
  2663. X
  2664. X/*--------------------------------------------------------------------------------*/
  2665. XLVAL Fbase_CopyBndryVrt()
  2666. X{
  2667. X    TVeosErr        iErr;
  2668. X    LVAL        pReturn;
  2669. X    TTimeStamp        tTest;
  2670. X
  2671. X
  2672. X    /** look for optional time-stamp-test **/
  2673. X
  2674. X    NATIVE_TIME_ARG(fbase_pbCopyBndryVrt.pTestTime, tTest);
  2675. X
  2676. X
  2677. X    /** dispatch the matcher **/
  2678. X
  2679. X    xlsave1(fbase_pbCopyBndryVrt.pXResult);
  2680. X    
  2681. X    Native_XMandR(&fbase_pbCopyBndryVrt);
  2682. X
  2683. X    xlpop();
  2684. X
  2685. X    pReturn = consp(fbase_pbCopyBndryVrt.pXResult) ?
  2686. X    car(fbase_pbCopyBndryVrt.pXResult) : fbase_pbCopyBndryVrt.pXResult;
  2687. X
  2688. X    return(pReturn);
  2689. X    }
  2690. X/*--------------------------------------------------------------------------------*/
  2691. X
  2692. X
  2693. X/*--------------------------------------------------------------------------------*
  2694. X           Beuratrcatic Linkage Between Fern Prims and XLISP
  2695. X *--------------------------------------------------------------------------------*/
  2696. X
  2697. X
  2698. X/*--------------------------------------------------------------------------------*/
  2699. XTVeosErr Fern_LoadPrims()
  2700. X{
  2701. X#define FERN_LOAD
  2702. X#include "fern_prims.h"
  2703. X#define FERN_LOAD
  2704. X    }
  2705. X/*--------------------------------------------------------------------------------*/
  2706. X
  2707. X
  2708. X
  2709. X/*--------------------------------------------------------------------------------*
  2710. X                   Private Functions
  2711. X *--------------------------------------------------------------------------------*/
  2712. X
  2713. X
  2714. X/*--------------------------------------------------------------------------------*/
  2715. XTVeosErr Fbase_()
  2716. X{
  2717. X    TVeosErr        iErr;
  2718. X
  2719. X    return(iErr);
  2720. X    }
  2721. X/*--------------------------------------------------------------------------------*/
  2722. X
  2723. X
  2724. X
  2725. X/*--------------------------------------------------------------------------------*/
  2726. Xvoid Fbase_Frame()
  2727. X{
  2728. X    LVAL        pMsg;
  2729. X
  2730. X
  2731. X    /** pass time to veos kernel for accounting.
  2732. X     **/
  2733. X    Kernel_SystemTask();
  2734. X
  2735. X
  2736. X    for (Native_NextMsg(&pMsg);
  2737. X     pMsg;
  2738. X     Native_NextMsg(&pMsg)) {
  2739. X
  2740. X    /** invoke normal lisp evaluator on message. 
  2741. X     **/ 
  2742. X    xlxeval(pMsg); 
  2743. X
  2744. X    /** at top of loop, when msgVar is set to next msg, 
  2745. X     ** old contents of msgVar are detached from any protected xlisp ptr, 
  2746. X     ** thus it will be garbage collected. 
  2747. X     **/ 
  2748. X    } 
  2749. X
  2750. X    /** do the persist procs. 
  2751. X     **/ 
  2752. X    if (!null(getvalue(s_pPersistProcs)))
  2753. X    xleval(getvalue(s_pPersistFunc));
  2754. X    }
  2755. X/*--------------------------------------------------------------------------------*/
  2756. X
  2757. X
  2758. X
  2759. X/*--------------------------------------------------------------------------------*/
  2760. XTVeosErr Fbase_InitMatcherPBs()
  2761. X{
  2762. X    /** copy-int-subs settings **/
  2763. X    
  2764. X    fbase_pbCopyIntSubs.pSrcGr = WORK_SPACE;
  2765. X    fbase_pbCopyIntSubs.iDestroyFlag = NANCY_CopyMatch;
  2766. X    fbase_pbCopyIntSubs.pXReplaceElt = nil;
  2767. X    fbase_pbCopyIntSubs.pStampTime = nil;
  2768. X
  2769. X    /** copy-bndry-vrt settings **/
  2770. X    
  2771. X    fbase_pbCopyBndryVrt.pSrcGr = WORK_SPACE;
  2772. X    fbase_pbCopyBndryVrt.iDestroyFlag = NANCY_CopyMatch;
  2773. X    fbase_pbCopyBndryVrt.pXReplaceElt = nil;
  2774. X    fbase_pbCopyBndryVrt.pStampTime = nil;
  2775. X
  2776. X    return(VEOS_SUCCESS);
  2777. X    
  2778. X    } /* Fbase_InitMatcherPBs */
  2779. X/*--------------------------------------------------------------------------------*/
  2780. X
  2781. X
  2782. X
  2783. END_OF_FILE
  2784. if test 11012 -ne `wc -c <'src/kernel_current/fern/fern.c'`; then
  2785.     echo shar: \"'src/kernel_current/fern/fern.c'\" unpacked with wrong size!
  2786. fi
  2787. # end of 'src/kernel_current/fern/fern.c'
  2788. fi
  2789. if test -f 'src/xlisp/xcore/c/xlimage.c' -a "${1}" != "-c" ; then 
  2790.   echo shar: Will not clobber existing file \"'src/xlisp/xcore/c/xlimage.c'\"
  2791. else
  2792. echo shar: Extracting \"'src/xlisp/xcore/c/xlimage.c'\" \(11043 characters\)
  2793. sed "s/^X//" >'src/xlisp/xcore/c/xlimage.c' <<'END_OF_FILE'
  2794. X/* -*-C-*-
  2795. X********************************************************************************
  2796. X*
  2797. X* File:         xlimage.c
  2798. X* RCS:          $Header: xlimage.c,v 1.5 89/11/25 05:30:58 mayer Exp $
  2799. X* Description:  xlisp memory image save/restore functions
  2800. X* Author:       David Michael Betz
  2801. X* Created:      
  2802. X* Modified:     Sat Nov 25 05:30:50 1989 (Niels Mayer) mayer@hplnpm
  2803. X* Language:     C
  2804. X* Package:      N/A
  2805. X* Status:       X11r4 contrib tape release
  2806. X*
  2807. X* WINTERP 1.0 Copyright 1989 Hewlett-Packard Company (by Niels Mayer).
  2808. X* XLISP version 2.1, Copyright (c) 1989, by David Betz.
  2809. X*
  2810. X* Permission to use, copy, modify, distribute, and sell this software and its
  2811. X* documentation for any purpose is hereby granted without fee, provided that
  2812. X* the above copyright notice appear in all copies and that both that
  2813. X* copyright notice and this permission notice appear in supporting
  2814. X* documentation, and that the name of Hewlett-Packard and David Betz not be
  2815. X* used in advertising or publicity pertaining to distribution of the software
  2816. X* without specific, written prior permission.  Hewlett-Packard and David Betz
  2817. X* make no representations about the suitability of this software for any
  2818. X* purpose. It is provided "as is" without express or implied warranty.
  2819. X*
  2820. X* HEWLETT-PACKARD AND DAVID BETZ DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
  2821. X* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
  2822. X* IN NO EVENT SHALL HEWLETT-PACKARD NOR DAVID BETZ BE LIABLE FOR ANY SPECIAL,
  2823. X* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  2824. X* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  2825. X* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  2826. X* PERFORMANCE OF THIS SOFTWARE.
  2827. X*
  2828. X* See ./winterp/COPYRIGHT for information on contacting the authors.
  2829. X* 
  2830. X* Please send modifications, improvements and bugfixes to mayer@hplabs.hp.com
  2831. X* Post XLISP-specific questions/information to the newsgroup comp.lang.lisp.x
  2832. X*
  2833. X********************************************************************************
  2834. X*/
  2835. Xstatic char rcs_identity[] = "@(#)$Header: xlimage.c,v 1.5 89/11/25 05:30:58 mayer Exp $";
  2836. X
  2837. X
  2838. X#include "xlisp.h"
  2839. X
  2840. X#ifdef SAVERESTORE
  2841. X
  2842. X/* external variables */
  2843. Xextern LVAL obarray,xlenv,xlfenv,xldenv,s_gchook,s_gcflag;
  2844. Xextern long nnodes,nfree,total;
  2845. Xextern int anodes,nsegs,gccalls;
  2846. Xextern struct segment *segs,*lastseg,*fixseg,*charseg;
  2847. Xextern CONTEXT *xlcontext;
  2848. Xextern LVAL fnodes;
  2849. X
  2850. X/* local variables */
  2851. Xstatic OFFTYPE off,foff,doff;
  2852. Xstatic FILE *fp;
  2853. X
  2854. X/* external procedures */
  2855. Xextern SEGMENT *newsegment();
  2856. Xextern FILE *osbopen();
  2857. Xextern char *malloc();
  2858. X
  2859. X/* forward declarations */
  2860. XOFFTYPE readptr();
  2861. XOFFTYPE cvoptr();
  2862. XLVAL cviptr();
  2863. X
  2864. X/* xlisave - save the memory image */
  2865. Xint xlisave(fname)
  2866. X  char *fname;
  2867. X{
  2868. X    char fullname[STRMAX+1];
  2869. X    unsigned char *cp;
  2870. X    SEGMENT *seg;
  2871. X    int n,i,max;
  2872. X    LVAL p;
  2873. X
  2874. X    /* default the extension */
  2875. X    if (needsextension(fname)) {
  2876. X    strcpy(fullname,fname);
  2877. X    strcat(fullname,".wks");
  2878. X    fname = fullname;
  2879. X    }
  2880. X
  2881. X    /* open the output file */
  2882. X    if ((fp = osbopen(fname,"w")) == NULL)
  2883. X    return (FALSE);
  2884. X
  2885. X    /* first call the garbage collector to clean up memory */
  2886. X    gc();
  2887. X
  2888. X    /* write out the pointer to the *obarray* symbol */
  2889. X    writeptr(cvoptr(obarray));
  2890. X
  2891. X    /* setup the initial file offsets */
  2892. X    off = foff = (OFFTYPE)2;
  2893. X
  2894. X    /* write out all nodes that are still in use */
  2895. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  2896. X    p = &seg->sg_nodes[0];
  2897. X    for (n = seg->sg_size; --n >= 0; ++p, off += 2) {
  2898. X        switch (ntype(p)) {
  2899. X        case FREE:
  2900. X        break;
  2901. X        case CONS:
  2902. X        case USTREAM:
  2903. X        setoffset();
  2904. X        osbputc(p->n_type,fp);
  2905. X        writeptr(cvoptr(car(p)));
  2906. X        writeptr(cvoptr(cdr(p)));
  2907. X        foff += 2;
  2908. X        break;
  2909. X        default:
  2910. X        setoffset();
  2911. X        writenode(p);
  2912. X        break;
  2913. X        }
  2914. X        }
  2915. X    }
  2916. X
  2917. X    /* write the terminator */
  2918. X    osbputc(FREE,fp);
  2919. X    writeptr((OFFTYPE)0);
  2920. X
  2921. X    /* write out data portion of vector-like nodes */
  2922. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  2923. X    p = &seg->sg_nodes[0];
  2924. X    for (n = seg->sg_size; --n >= 0; ++p) {
  2925. X        switch (ntype(p)) {
  2926. X/* Include hybrid-class functions: *//* JSP */
  2927. X#define MODULE_XLIMAGE_C_XLISAVE
  2928. X#include "../../xmodules.h"
  2929. X#undef MODULE_XLIMAGE_C_XLISAVE
  2930. X
  2931. X        case SYMBOL:
  2932. X        case OBJECT:
  2933. X        case VECTOR:
  2934. X        case CLOSURE:
  2935. X        case STRUCT:
  2936. X            vector:
  2937. X        max = getsz(p);
  2938. X        for (i = 0; i < max; ++i)
  2939. X            writeptr(cvoptr(getelement(p,i)));
  2940. X        break;
  2941. X        case STRING:
  2942. X        max = getslength(p);
  2943. X        for (cp = getstring(p); --max >= 0; )
  2944. X            osbputc(*cp++,fp);
  2945. X        break;
  2946. X        }
  2947. X        }
  2948. X    }
  2949. X
  2950. X    /* close the output file */
  2951. X    osclose(fp);
  2952. X
  2953. X    /* return successfully */
  2954. X    return (TRUE);
  2955. X}
  2956. X
  2957. X/* xlirestore - restore a saved memory image */
  2958. Xint xlirestore(fname)
  2959. X  char *fname;
  2960. X{
  2961. X    extern FUNDEF *funtab;
  2962. X    char fullname[STRMAX+1];
  2963. X    unsigned char *cp;
  2964. X    int n,i,max,type;
  2965. X    SEGMENT *seg;
  2966. X    LVAL p;
  2967. X
  2968. X    /* default the extension */
  2969. X    if (needsextension(fname)) {
  2970. X    strcpy(fullname,fname);
  2971. X    strcat(fullname,".wks");
  2972. X    fname = fullname;
  2973. X    }
  2974. X
  2975. X    /* open the file */
  2976. X    if ((fp = osbopen(fname,"r")) == NULL)
  2977. X    return (FALSE);
  2978. X
  2979. X    /* free the old memory image */
  2980. X    freeimage();
  2981. X
  2982. X    /* initialize */
  2983. X    off = (OFFTYPE)2;
  2984. X    total = nnodes = nfree = 0L;
  2985. X    fnodes = NIL;
  2986. X    segs = lastseg = NULL;
  2987. X    nsegs = gccalls = 0;
  2988. X    xlenv = xlfenv = xldenv = s_gchook = s_gcflag = NIL;
  2989. X    xlstack = xlstkbase + EDEPTH;
  2990. X    xlcontext = NULL;
  2991. X
  2992. X    /* create the fixnum segment */
  2993. X    if ((fixseg = newsegment(SFIXSIZE)) == NULL)
  2994. X    xlfatal("insufficient memory - fixnum segment");
  2995. X
  2996. X    /* create the character segment */
  2997. X    if ((charseg = newsegment(CHARSIZE)) == NULL)
  2998. X    xlfatal("insufficient memory - character segment");
  2999. X
  3000. X    /* read the pointer to the *obarray* symbol */
  3001. X    obarray = cviptr(readptr());
  3002. X
  3003. X    /* read each node */
  3004. X    while ((type = osbgetc(fp)) >= 0)
  3005. X    switch (type) {
  3006. X    case FREE:
  3007. X        if ((off = readptr()) == (OFFTYPE)0)
  3008. X        goto done;
  3009. X        break;
  3010. X    case CONS:
  3011. X    case USTREAM:
  3012. X        p = cviptr(off);
  3013. X        p->n_type = type;
  3014. X        p->n_flags = 0;
  3015. X        rplaca(p,cviptr(readptr()));
  3016. X        rplacd(p,cviptr(readptr()));
  3017. X        off += 2;
  3018. X        break;
  3019. X    default:
  3020. X        readnode(type,cviptr(off));
  3021. X        off += 2;
  3022. X        break;
  3023. X    }
  3024. Xdone:
  3025. X
  3026. X    /* read the data portion of vector-like nodes */
  3027. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  3028. X    p = &seg->sg_nodes[0];
  3029. X    for (n = seg->sg_size; --n >= 0; ++p)
  3030. X        switch (ntype(p)) {
  3031. X/* Include hybrid-class functions: *//* JSP */
  3032. X#define MODULE_XLIMAGE_C_XLIRESTORE
  3033. X#include "../../xmodules.h"
  3034. X#undef MODULE_XLIMAGE_C_XLIRESTORE
  3035. X        case SYMBOL:
  3036. X        case OBJECT:
  3037. X        case VECTOR:
  3038. X        case CLOSURE:
  3039. X        case STRUCT:
  3040. X            vector:
  3041. X        max = getsz(p);
  3042. X        if ((p->n_vdata = (LVAL *)malloc(max * sizeof(LVAL))) == NULL)
  3043. X            xlfatal("insufficient memory - vector");
  3044. X        total += (long)(max * sizeof(LVAL));
  3045. X        for (i = 0; i < max; ++i)
  3046. X            setelement(p,i,cviptr(readptr()));
  3047. X        break;
  3048. X        case STRING:
  3049. X        max = getslength(p);
  3050. X        if ((p->n_string = (unsigned char *)malloc(max)) == NULL)
  3051. X            xlfatal("insufficient memory - string");
  3052. X        total += (long)max;
  3053. X        for (cp = getstring(p); --max >= 0; )
  3054. X            *cp++ = osbgetc(fp);
  3055. X        break;
  3056. X        case STREAM:
  3057. X        setfile(p,NULL);
  3058. X        break;
  3059. X        case SUBR:
  3060. X        case FSUBR:
  3061. X        p->n_subr = funtab[getoffset(p)].fd_subr;
  3062. X        break;
  3063. X        }
  3064. X    }
  3065. X
  3066. X    /* close the input file */
  3067. X    osclose(fp);
  3068. X
  3069. X    /* collect to initialize the free space */
  3070. X    gc();
  3071. X
  3072. X    /* lookup all of the symbols the interpreter uses */
  3073. X    xlsymbols();
  3074. X
  3075. X    /* return successfully */
  3076. X    return (TRUE);
  3077. X}
  3078. X
  3079. X/* freeimage - free the current memory image */
  3080. XLOCAL freeimage()
  3081. X{
  3082. X    SEGMENT *seg,*next;
  3083. X    FILE *fp;
  3084. X    LVAL p;
  3085. X    int n;
  3086. X
  3087. X    /* free the data portion of vector-like nodes */
  3088. X    for (seg = segs; seg != NULL; seg = next) {
  3089. X    p = &seg->sg_nodes[0];
  3090. X    for (n = seg->sg_size; --n >= 0; ++p)
  3091. X        switch (ntype(p)) {
  3092. X/* Include hybrid-class functions: *//* JSP */
  3093. X#define MODULE_XLIMAGE_C_FREEIMAGE
  3094. X#include "../../xmodules.h"
  3095. X#undef MODULE_XLIMAGE_C_FREEIMAGE
  3096. X        case SYMBOL:
  3097. X        case OBJECT:
  3098. X        case VECTOR:
  3099. X        case CLOSURE:
  3100. X        case STRUCT:
  3101. X            vector:
  3102. X        if (p->n_vsize)
  3103. X            free(p->n_vdata);
  3104. X        break;
  3105. X        case STRING:
  3106. X        if (getslength(p))
  3107. X            free(getstring(p));
  3108. X        break;
  3109. X        case STREAM:
  3110. X                if ((fp  = getfile(p)) &&
  3111. X                    (fp != stdin       &&
  3112. X                     fp != stdout      && 
  3113. X                     fp != stderr)
  3114. X                ) {
  3115. X            osclose(getfile(p));
  3116. X                }
  3117. X        break;
  3118. X        }
  3119. X    next = seg->sg_next;
  3120. X    free(seg);
  3121. X    }
  3122. X}
  3123. X
  3124. X/* setoffset - output a positioning command if nodes have been skipped */
  3125. XLOCAL setoffset()
  3126. X{
  3127. X    if (off != foff) {
  3128. X    osbputc(FREE,fp);
  3129. X    writeptr(off);
  3130. X    foff = off;
  3131. X    }
  3132. X}
  3133. X
  3134. X/* writenode - write a node to a file */
  3135. XLOCAL writenode(node)
  3136. X  LVAL node;
  3137. X{
  3138. X    char *p = (char *)&node->n_info;
  3139. X    int n = sizeof(union ninfo);
  3140. X    osbputc(node->n_type,fp);
  3141. X    while (--n >= 0)
  3142. X    osbputc(*p++,fp);
  3143. X    foff += 2;
  3144. X}
  3145. X
  3146. X/* writeptr - write a pointer to a file */
  3147. XLOCAL writeptr(off)
  3148. X  OFFTYPE off;
  3149. X{
  3150. X    char *p = (char *)&off;
  3151. X    int n = sizeof(OFFTYPE);
  3152. X    while (--n >= 0)
  3153. X    osbputc(*p++,fp);
  3154. X}
  3155. X
  3156. X/* readnode - read a node */
  3157. XLOCAL readnode(type,node)
  3158. X  int type; LVAL node;
  3159. X{
  3160. X    char *p = (char *)&node->n_info;
  3161. X    int n = sizeof(union ninfo);
  3162. X    node->n_type = type;
  3163. X    node->n_flags = 0;
  3164. X    while (--n >= 0)
  3165. X    *p++ = osbgetc(fp);
  3166. X}
  3167. X
  3168. X/* readptr - read a pointer */
  3169. XLOCAL OFFTYPE readptr()
  3170. X{
  3171. X    OFFTYPE off;
  3172. X    char *p = (char *)&off;
  3173. X    int n = sizeof(OFFTYPE);
  3174. X    while (--n >= 0)
  3175. X    *p++ = osbgetc(fp);
  3176. X    return (off);
  3177. X}
  3178. X
  3179. X/* cviptr - convert a pointer on input */
  3180. XLOCAL LVAL cviptr(o)
  3181. X  OFFTYPE o;
  3182. X{
  3183. X    OFFTYPE off = (OFFTYPE)2;
  3184. X    SEGMENT *seg;
  3185. X
  3186. X    /* check for nil */
  3187. X    if (o == (OFFTYPE)0)
  3188. X    return ((LVAL)o);
  3189. X
  3190. X    /* compute a pointer for this offset */
  3191. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  3192. X    if (o >= off && o < off + (OFFTYPE)(seg->sg_size << 1))
  3193. X        return (seg->sg_nodes + ((int)(o - off) >> 1));
  3194. X    off += (OFFTYPE)(seg->sg_size << 1);
  3195. X    }
  3196. X
  3197. X    /* create new segments if necessary */
  3198. X    for (;;) {
  3199. X
  3200. X    /* create the next segment */
  3201. X    if ((seg = newsegment(anodes)) == NULL)
  3202. X        xlfatal("insufficient memory - segment");
  3203. X
  3204. X    /* check to see if the offset is in this segment */
  3205. X    if (o >= off && o < off + (OFFTYPE)(seg->sg_size << 1))
  3206. X        return (seg->sg_nodes + ((int)(o - off) >> 1));
  3207. X    off += (OFFTYPE)(seg->sg_size << 1);
  3208. X    }
  3209. X}
  3210. X
  3211. X/* cvoptr - convert a pointer on output */
  3212. XLOCAL OFFTYPE cvoptr(p)
  3213. X  LVAL p;
  3214. X{
  3215. X    OFFTYPE off = (OFFTYPE)2;
  3216. X    SEGMENT *seg;
  3217. X
  3218. X    /* check for nil and small fixnums */
  3219. X    if (p == NIL)
  3220. X    return ((OFFTYPE)p);
  3221. X
  3222. X    /* compute an offset for this pointer */
  3223. X    for (seg = segs; seg != NULL; seg = seg->sg_next) {
  3224. X    if (CVPTR(p) >= CVPTR(&seg->sg_nodes[0]) &&
  3225. X        CVPTR(p) <  CVPTR(&seg->sg_nodes[0] + seg->sg_size))
  3226. X        return (off + (OFFTYPE)((p - seg->sg_nodes) << 1));
  3227. X    off += (OFFTYPE)(seg->sg_size << 1);
  3228. X    }
  3229. X
  3230. X    /* pointer not within any segment */
  3231. X    xlerror("bad pointer found during image save",p);
  3232. X}
  3233. X
  3234. X#endif
  3235. X
  3236. END_OF_FILE
  3237. if test 11043 -ne `wc -c <'src/xlisp/xcore/c/xlimage.c'`; then
  3238.     echo shar: \"'src/xlisp/xcore/c/xlimage.c'\" unpacked with wrong size!
  3239. fi
  3240. # end of 'src/xlisp/xcore/c/xlimage.c'
  3241. fi
  3242. echo shar: End of archive 5 \(of 16\).
  3243. cp /dev/null ark5isdone
  3244. MISSING=""
  3245. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
  3246.     if test ! -f ark${I}isdone ; then
  3247.     MISSING="${MISSING} ${I}"
  3248.     fi
  3249. done
  3250. if test "${MISSING}" = "" ; then
  3251.     echo You have unpacked all 16 archives.
  3252.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  3253. else
  3254.     echo You still need to unpack the following archives:
  3255.     echo "        " ${MISSING}
  3256. fi
  3257. ##  End of shell archive.
  3258. exit 0
  3259.